單例模式——執行緒安全的兩種實現

消失er發表於2018-01-18

單例模式——執行緒安全的兩種實現

一、雙重檢查鎖定(double-checked locking)

public class SingleTon {
    
    // 靜態例項變數加上volatile
    private static volatile SingleTon instance;

    // 私有化建構函式
    private SingleTon() {}

    // 雙重檢查鎖
    public static SingleTon getInstance() {
        if (instance == null) {
            synchronized(SingleTon.class){
                if(instance == null){
                    instance = new SingleTon();
                }
            }
        }
        return instance;
    }
}
  • 推薦使用懶漢式寫法,即延遲載入,當需要用到例項的時候,才去初始化(new)此例項。但在併發環境下,一重判斷,即判斷一次instance為null,是不行的,併發環境下如果同時多個執行緒進入方法體就不能保證單例了,因此衍生了雙重檢查鎖定的實現。

二、靜態內部類實現 單例模式

public class SingleTon {

    // 私有化建構函式
    private SingleTon() {}

    // 利用靜態內部類特性實現外部類的單例
    private static class SingleTonBuilder {
        private static SingleTon singleTon = new SingleTon();
    }
    
    public static SingleTon getInstance() {
        return SingleTonBuilder.singleTon;
    }

    public static void main(String[] args) {
        SingleTon instance = SingleTon.getInstance();
    }
}

靜態內部類實現單例模式,主要原理為:Java中靜態內部類可以訪問其外部類的靜態成員屬性,同時,靜態內部類只有當被呼叫的時候才開始首次被載入,利用了classloader的機制來保證初始化instance時只有一個執行緒,所以也是執行緒安全的,同時沒有效能損耗(加synchronized同步鎖),這種實現更推薦。


相關文章