【发布时间】:2018-09-25 05:12:30
【问题描述】:
我只是在实践中阅读并发。我开始知道有必要在字段的双重检查锁定机制中使用 volatile 关键字,否则线程可以读取非空对象的陈旧值。因为它有可能在不使用 volatile 关键字的情况下重新排序指令。因为该对象引用可以在调用构造函数之前分配给资源变量。所以线程可以看到部分构造的对象。
我对此有疑问。
我假设同步块也会限制编译器重新排序指令,那么为什么我们需要 volatile 关键字呢?
public class DoubleCheckedLocking {
private static volatile Resource resource;
public static Resource getInstance() {
if (resource == null) {
synchronized (DoubleCheckedLocking.class) {
if (resource == null)
resource = new Resource();
}
}
return resource;
}
}
【问题讨论】:
-
@ElliottFrisch - 聪明,在 Java 还年轻的时候就坏了(你的链接来自 2001 年),working since 2004,但比更干净的替代品更糟糕(请参阅我的答案中的链接)
标签: java multithreading concurrency volatile