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?
禁止指令重排
線程可見
參考