单例的几种实现方式

饿汉模式

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton(){};
    public Singleton getInstance(){
        return instance;
    }
}

懒汉模式

public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton(){};
    public static Singleton getInstance() {
        Singleton temp = instance;//1.用一个局部变量接收instance,可以让positive情况下只读取一次volatile变量
        if(null == temp){
            synchronized (Singleton.class){
                temp = instance;//2
                if(null == temp){
                    temp = new Singleton();
                    instance=temp;
                }
            }
        }
        return temp;//3
    }
}

参考 https://www.javacodemonk.com/threadsafe-singleton-design-pattern-java-806ad7e6
这里用一个局部变量接收instance,可以让positive情况下(即instance不为null,则运行1和3)只读取一次volatile变量instance,而negative情况下和原来一致。我们知道volatile的读取和写入都需要与主内存交互,所以是一个比较耗时的操作。

comments powered by Disqus