java 部分构造对象

zpgglvta  于 2023-02-07  发布在  Java
关注(0)|答案(2)|浏览(94)

如果一个对象在初始化过程中对其他线程可见(初始化过程中可见,但尚未完成),这是否可能?如果是,请给予一个简单的例子来支持你的理由?

ktecyv1j

ktecyv1j1#

这可以通过多种方式实现。

  • 在构造函数中将对象传递给另一个线程,例如,在构造函数中启动一个线程。
  • 您将对象传递给另一个线程,但另一个线程看到的是旧的、未初始化的值,因为这些字段不是final字段、volatile字段或在锁定或同步块中访问的字段。不能保证其他字段是线程安全的。
ldfqzlk8

ldfqzlk82#

最好的例子就是众所周知的双重检查锁定习惯用法,我将从它中提取与这个参数相关的部分,看下面的代码:

public class Holder { public static File f; }

在线程A的某个地方执行Holder.f = new File("path");,在线程B的其他地方执行File xxf = Holder.f;并继续使用它。不能保证,即使你读取了对Holder.f的引用,File示例的任何字段都将处于任何定义的状态。你可以读取所有的空值(零、假,取决于类型),以及非空值和空值的任何组合。

相关问题