在Head First设计模式手册中,具有双重检查锁定的单例模式已实现如下:
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使用不会 违反使用双重检查锁定(即性能)的目的吗?
volatile
真正的问题是Thread A可能instance在完成构造之前为其分配存储空间instance。Thread B将看到该作业并尝试使用它。Thread B由于使用的是的部分构造版本,因此导致失败instance。
Thread A
instance
Thread B