如果对象在初始化期间对其他线程可见(在进行初始化时可见但尚未完成),这是否可行?如果是,那么请你举一个简单的例子来备份你的理由吗?
答案 0 :(得分:4)
这可能以多种方式发生。
答案 1 :(得分:1)
最好的例子就是臭名昭着的双重锁定成语。我将从中仅提取与此论点相关的部分。拿这个代码:
public class Holder { public static File f; }
在线程A中的某个位置执行Holder.f = new File("path");
和线程B中的其他位置File xxf = Holder.f;
并继续使用它。即使您阅读Holder.f
的引用,也无法保证File
实例的任何字段都处于任何已定义的状态。您可以读取所有空值,(零,falses,取决于类型),甚至是非空值和空值的任何变态组合。