0

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

4

2 回答 2

5

这可以通过多种方式发生。

  • 您将对象传递给构造函数中的另一个线程,例如,您在构造函数中启动一个线程。
  • 您将对象传递给另一个线程,但另一个线程看到旧的、未初始化的值,因为这些字段不是最终的或易失的,也不是在锁定或同步的块中访问的。其他字段不保证是线程安全的。
于 2012-08-18T08:31:18.773 回答
2

最好的例子是臭名昭著的双重检查锁定习语。我将只从中提取与该论点相关的部分。拿这个代码:

public class Holder { public static File f; }

你在线程 A 的某个地方做Holder.f = new File("path");,在线程 B 的其他地方做File xxf = Holder.f;,然后继续使用它。无法保证,即使您阅读了对 的引用Holder.f,实例的任何字段File都将处于任何已定义的状态。您可以读取所有空值(零值、假值,取决于类型),甚至是非空值和空值的任何变态组合。

于 2012-08-18T08:55:47.827 回答