为什么易失性在双重检查锁定中使用?

为什么易失性在双重检查锁定中使用?

从…头第一设计模式书中,具有双重检查锁定的单例模式已经实现如下:

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使用失败了使用双重检查锁定的目的,即性能?


冉冉说
浏览 759回答 3
3回答

慕容3067478

好吧,在性能上没有双重检查的锁定。这是一个坏的模式。把情感放在一边,volatile是因为没有它,当第二个线程通过时instance == null,第一个线程可能不会构造new Singleton()然而:没有人承诺创造这个物体。发生-之前指派给instance对于除实际创建对象的线程之外的任何线程。volatile反过来建立发生-之前读写之间的关系,并修复中断的模式。如果您正在寻找性能,请使用Holding内部静态类代替。
打开App,查看更多内容
随时随地看视频慕课网APP