部分构造的对象

时间:2012-08-18 08:14:40

标签: java

如果对象在初始化期间对其他线程可见(在进行初始化时可见但尚未完成),这是否可行?如果是,那么请你举一个简单的例子来备份你的理由吗?

2 个答案:

答案 0 :(得分:4)

这可能以多种方式发生。

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

答案 1 :(得分:1)

最好的例子就是臭名昭着的双重锁定成语。我将从中仅提取与此论点相关的部分。拿这个代码:

public class Holder { public static File f; }

在线程A中的某个位置执行Holder.f = new File("path");和线程B中的其他位置File xxf = Holder.f;并继续使用它。即使您阅读Holder.f的引用,也无法保证File实例的任何字段都处于任何已定义的状态。您可以读取所有空值,(零,falses,取决于类型),甚至是非空值和空值的任何变态组合。