1、构造函数必须设置为private
避免被new 出来,只能通过暴露的方法获取实例
2、懒汉和恶汉
懒汉就是用的时候才加载
double check
public class SingletonWithDoubleChecked {
private SingletonWithDoubleChecked(){};
private static volatile SingletonWithDoubleChecked instance = null;
private static final Object lock = new Object();
public static SingletonWithDoubleChecked getInstance(){
if (instance == null) {
synchronized(lock) {
if (instance == null) {
instance = new SingletonWithDoubleChecked();
}
}
}
return instance;
}
}
类似饿汉,但是用的时候才加载
public class SingletonTest {
private SingletonTest(){};
private static class SingletonGet{
private static final SingletonTest instance = new SingletonTest();
}
public static SingletonTest getInstance(){
return SingletonGet.instance;
}
}
饿汉就是项目启动就加载
public class SingletonTest {
private SingletonTest(){};
private static final SingletonTest instance = new SingletonTest();
public static SingletonTest getInstance(){
return instance;
}
}
为什么double check 需要volatile?
禁止指令重排
线程可见
参考