【发布时间】:2012-08-14 13:36:08
【问题描述】:
如果一个对象在其初始化期间对其他线程可见(在进行初始化时可见但尚未完成),这是否可能?如果是,那么您能否举一个简单的例子来支持您的理由?
【问题讨论】:
标签: java
如果一个对象在其初始化期间对其他线程可见(在进行初始化时可见但尚未完成),这是否可能?如果是,那么您能否举一个简单的例子来支持您的理由?
【问题讨论】:
标签: java
这可以通过多种方式发生。
【讨论】:
this 并抛出一个异常,你将得到一个部分构造的对象。 ;)
最好的例子是臭名昭著的双重检查锁定习语。我将只从中提取与该论点相关的部分。拿这个代码:
public class Holder { public static File f; }
在线程 A 的某个地方你执行Holder.f = new File("path"); 和在线程 B 的其他地方你执行 File xxf = Holder.f; 并继续使用它。即使您阅读了对Holder.f 的引用,也无法保证File 实例的任何字段都将处于任何已定义的状态。您可以读取所有空值(零值、假值,取决于类型),甚至是非空值和空值的任何变态组合。
【讨论】:
final字段来引用一个新构造的新写的持有者,该持有者从未通过任何其他方式暴露;对final 字段的引用的存储能否保证对对象内项目的所有写入都已完成?
final 字段的正确构造版本。它还将看到引用的任何对象或数组的版本由那些至少与final 字段一样最新的final 字段。”我认为这完全涵盖了您所询问的内容。
final。知道非常有用。谢谢。