public class HungrySingleton {
private static final HungrySingleton instance = new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return instance;
}
}
餓漢模式在類載入的時候就完成了範例化,所以沒有執行緒同步問題
public class LazySingleton {
private static volatile LazySingleton instance = null;
//加private避免在外部被範例化
private LazySingleton(){}
public static LazySingleton getInstance(){
if (instance == null){
instance = new LazySingleton();
}
return instance;
}
}
適用於單執行緒,由於當執行緒1執行完 if (instance == null)後,還沒開始new物件,執行緒2可能已經通過了這個判斷並且已經範例化了物件,這時候就會產生多個物件
public class LazySingleton {
//加上volatile關鍵字保證instance在所有執行緒中同步(操作可見性)
private static volatile LazySingleton instance = null;
//加private避免在外部被範例化
private LazySingleton(){}
//加synchronized同步
public static synchronized LazySingleton getInstance(){
if (instance == null){
instance = new LazySingleton();
}
return instance;
}
}
適用於多執行緒。在原基礎上加了雙重鎖(volatile和synchronized)可以保證在多執行緒環境下的安全問題