gpt4 book ai didi

java - 在使用双锁时使单例实例易失有什么意义?

转载 作者:IT老高 更新时间:2023-10-28 21:04:33 26 4
gpt4 key购买 nike

private volatile static Singleton uniqueInstance

在单例中,当使用双锁方法进行同步时,为什么将单个实例声明为 volatile ?我可以在不将其声明为 volatile 的情况下实现相同的功能吗?

最佳答案

volatile 可防止内存写入被重新排序,从而使其他线程无法通过单例指针读取单例中未初始化的字段。

考虑这种情况:线程 A 发现 uniqueInstance == null,锁定,确认它仍然是 null,并调用单例的构造函数。构造函数写入 Singleton 中的成员 XYZ 并返回。线程 A 现在将对新创建的单例的引用写入 uniqueInstance,并准备释放它的锁。

就在线程 A 准备释放它的锁时,线程 B 出现,并发现 uniqueInstance 不是 null。线程 B 访问 uniqueInstance.XYZ 以为自己已经初始化了,但是由于 CPU 已经重新排序写入,线程 A 已经写入 XYZ 的数据> 尚未对线程 B 可见。因此,线程 B 在 XYZ 中看到了不正确的值,这是错误的。

当您将 uniqueInstance 标记为 volatile 时,会插入一个 内存屏障。在 uniqueInstance 之前发起的所有写入都将在 uniqueInstance 被修改之前完成,从而防止上述重新排序的情况。

关于java - 在使用双锁时使单例实例易失有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11639746/

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