一尘不染

Java 为什么在双重检查锁定中使用了volatile

java

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使用不会 违反使用双重检查锁定(即性能)的目的吗?


阅读 473

收藏
2020-02-28

共1个答案

一尘不染

真正的问题是Thread A可能instance在完成构造之前为其分配存储空间instanceThread B将看到该作业并尝试使用它。Thread B由于使用的是的部分构造版本,因此导致失败instance

2020-02-28