Java能在通过某种方法构造对象之前写入对象的引用吗?

Java能在通过某种方法构造对象之前写入对象的引用吗?,java,concurrency,double-checked-locking,Java,Concurrency,Double Checked Locking,使用双重检查锁定模式时存在一个众所周知的陷阱(示例和解释取自“实践中的并发”): 某些线程可能会看到'resource'变量的初始化值,而对象本身仍在构造中 问题是:如果我们用某种方法构造资源对象,问题是否仍然存在?即 resource = createResource(); 某些线程可以评估资源吗!=当资源对象仍在createResource()方法中构造时,null为true?是的,某些线程可以,或者更确切地说可以。您发布的代码这些天工作正常。只有在早期的内存模型(Java1.5之前)中,

使用双重检查锁定模式时存在一个众所周知的陷阱(示例和解释取自“实践中的并发”):

某些线程可能会看到'resource'变量的初始化值,而对象本身仍在构造中

问题是:如果我们用某种方法构造资源对象,问题是否仍然存在?即

resource = createResource();

某些线程可以评估资源吗!=当资源对象仍在createResource()方法中构造时,null为true?

是的,某些线程可以,或者更确切地说可以。您发布的代码这些天工作正常。只有在早期的内存模型(Java1.5之前)中,DCL模式才有缺陷


此外,DCL现在已经过时,因为创建延迟加载单例的最佳方法是使用单例枚举模式。

要回答您的问题,在您给出的示例中,如果您使用方法或直接调用
new
,则行为不会改变。影响线程之间行为的是某种类型的内存障碍。方法分派是不够的

但是,双重检查锁定从Java5开始就可以工作,尽管您需要在实例上使用
volatile
关键字。(以提供内存屏障,正如它所发生的那样。)


自从Java 5以来,它就不再是一个问题了。
resource = createResource();