饿汉模式
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的读取和写入都需要与主内存交互,所以是一个比较耗时的操作。