gpt4 book ai didi

java - 在 DCL 的情况下需要 volatile 关键字

转载 作者:行者123 更新时间:2023-12-02 07:19:37 28 4
gpt4 key购买 nike

我只是在阅读实践中的并发性。我开始知道有必要在字段的双重检查锁定机制中使用 volatile 关键字,否则线程可以读取非空对象的陈旧值。因为有可能在不使用 volatile 关键字的情况下对指令进行重新排序。由于该对象引用可以在调用构造函数之前分配给资源变量。所以线程可以看到部分构造的对象。

我有一个问题。

我假设 synchronized block 也限制编译器对指令重新排序,那么为什么我们在这里需要 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;
}
}

最佳答案

JMM 仅保证如果调用线程 (T1) 也从同步块(synchronized block)(在同一锁上)读取另一个线程 T2 在同步块(synchronized block)中创建的正确初始化对象,则线程 T1 将看到该对象。

由于 T1 可以看到资源不为空,因此无需通过同步块(synchronized block)就立即返回它,它可以得到一个对象但看不到它的状态正确初始化

使用 volatile 可以恢复这种保证,因为在写入 volatile 字段和读取该 volatile 字段之间存在先行关系。

关于java - 在 DCL 的情况下需要 volatile 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49840773/

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