Java 为什么在双重检查锁定中使用了volatile
在Head First
设计模式手册中,具有双重检查锁定的单例模式已实现如下:
public class Singleton { private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
我不明白为什么volatile
要使用它。volatile
使用不会 违反使用双重检查锁定(即性能)的目的吗?
回答:
真正的问题是Thread A
可能instance
在完成构造之前为其分配存储空间instance
。Thread B
将看到该作业并尝试使用它。Thread B
由于使用的是的部分构造版本,因此导致失败instance
。
以上是 Java 为什么在双重检查锁定中使用了volatile 的全部内容, 来源链接: utcz.com/qa/414585.html