【发布时间】:2017-01-28 05:19:47
【问题描述】:
我想知道在 Singleton 的双空检查实现中将 Instance 变量设置为 volatile 有什么用。因为根据我的理解,同步块提供隐式发生在之前。没有两个线程可以同时访问该同步块,并且在退出同步块时,线程将其所有本地缓存数据写入主内存。 我搜索了很多,但我仍然对这个实现有疑问。请说明正确使用方法。
private volatile Singleton INSTANCE;
public Singleton get() {
if (INSTANCE == null) {
synchronized (this) {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
在上面的双重检查代码中。如果我不让我的实例变得易变,可能会出现什么问题。因为当第一个线程进入同步块时,没有其他线程可以访问该块。当第一个线程离开该块时。对象将被创建,由于发生在属性之前,实例的最新值将被写入主内存。那么为什么 volatile 在这种情况下很重要呢?
这是类似问题的链接 (Is there any need to add volatile keyword to guarantee thread-safe singleton class in java?)。但答案不是很清楚。 我认为在上述给定的场景中,任何类型的 JVM 优化都不会导致同步块之前发生中断
【问题讨论】:
-
向我们展示您正在谈论的代码,并在您谈论之前准确地向我们展示发生了什么。那我们就可以解释了。
-
(这可能是重复的,但如果没有更多细节,很难选择最好的副本。)
-
请将其放入问题中。
-
这是28034564的副本
标签: java multithreading singleton volatile