使用双重检查锁定模式时有一个众所周知的陷阱(示例和解释摘自“实践中的并发”):
@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;
}
}
某些线程可能会看到“资源”变量的初始化值,而对象本身仍在构建中。
一个问题是:如果我们以某种方法构造资源对象,问题是否仍然存在?IE
resource = createResource();
当资源对象仍在 createResource() 方法中构建时,某些线程可以将资源 != null 评估为 true 吗?