單例模式在單執行緒多執行緒下的寫法

2020-10-09 16:00:20

1、餓漢模式

public class HungrySingleton {

    private static final HungrySingleton instance = new HungrySingleton();

    private HungrySingleton(){}

    public static HungrySingleton getInstance(){
        return instance;
    }
}

餓漢模式在類載入的時候就完成了範例化,所以沒有執行緒同步問題

2、懶漢模式

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可能已經通過了這個判斷並且已經範例化了物件,這時候就會產生多個物件

3、懶漢模式(加鎖)

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)可以保證在多執行緒環境下的安全問題