gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:47:08 25 4
gpt4 key购买 nike

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

@NotThreadSafe
public class DoubleCheckedLocking {

private static Resource resource;

public static Resource getInstance() {
if (resource == null) {
synchronized (DoubleCheckedLocking.class) {
if (resource == null)
resource = new Resource();
}
}
return resource;
}

}

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

一个问题是:如果我们在某种方法中构造资源对象,问题是否仍然存在? IE。

resource = createResource();

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

最佳答案

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

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

关于java - Java可以在通过某种方法构造对象之前写入对对象的引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25316370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com