單例模式三(雙重檢查)

  懶漢式的延遲加載可以解決線程安全和節省內存,但又會引起性能不足。

  按照上一篇文章的代碼,a,b多個線程執行情況下,如果a先進入了方法處於允許狀態,那b線程則只能處於監聽狀態。

通過調式效果如下

之前是讓其他線程在方法外面待着,那是否可以讓它們也先進方法裏面來等待呢?這就跟餐廳排隊等一樣,站在外面風吹日曬,不如先讓顧客進大廳進行排隊。

代碼改版後的2.1

public class LazySingletion {
    private LazySingletion(){

    }
    private static   LazySingletion single;

    protected   static LazySingletion getInstance(){
        synchronized(LazySingletion.class){
            if(single == null ){
                single = new LazySingletion();
            }
        }
        return  single;
    }
}

  這裏有人會產生疑問,這換湯不換藥啊,還是需要等待。所以這段代碼還有改進的餘地。

  改進思路:1.可以先判斷是否已經存纔對象,再來考慮是否排隊

 2.2版本

public class LazySingletion {
    private LazySingletion(){

    }
    private volatile static   LazySingletion single;

    protected   static LazySingletion getInstance(){
        if(single == null){
            synchronized(LazySingletion.class){
                if(single == null ){
                    single = new LazySingletion();
                }
            }
        }
        return  single;
    }
}

爲了避免執行重排序問題,這裏可以加了一個關鍵字 volatile

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章