單例模式的雙檢鎖的隱患和優化

2022-03-19 05:26:00 字數 672 閱讀 9251

摘錄加總結------

(1)傳統的單例模式的雙檢鎖

public class singleton }}

return sinstance;

}private singleton() {}

}

雙檢鎖的設定可以避免在1和2位置處,在併發時假如a執行緒和b執行緒都進入了1位置,但是a獲取到了鎖,new了物件之後,b獲取到鎖之後又重複new乙個例項,但是仍然在3位置處可能會有以下問題,即指令重排的問題

new乙個例項時,會分配例項記憶體大小,初始化物件,設定引用指向的過程,但是如果指令重排之後就有可能像上圖那樣子,執行緒a分配例項記憶體大小,設定了引用指向記憶體空間,但是b執行緒由於判斷到引用不為空,就會在a執行緒初始化物件之前訪問到乙個空的物件。而不是再new乙個物件。所以需要在例項屬性前面加上volatile關鍵字,保證執行緒可見性,通過設定記憶體屏障方式禁止指令重排。

public class singleton }}

return sinstance;

}private singleton() {}

}

3 單例模式 雙檢測鎖機制的單例模式

前面介紹的懶漢式單例模式使用方法,在單執行緒的程式應用中是沒有任何問題的,但是在多執行緒的程式中就會出現問題,當多個執行緒都進行if instance null 判斷時,就會產生多個類的例項,這就違反了單例模式的原則,也不符合程式的需要,怎麼辦呢?對於多執行緒下的應用,可以增加synchronize...

著名的雙檢鎖技術

最近公司的專案中發現乙個編譯優化導致的bug。同事敘述為 在cpu 開啟out of order execution 優化時,是有 bug的 針對這個問題,比較好的優化方法如下 private static jobmanager self private static object asyncobj...

單例模式雙檢驗鎖中的volatile理解

public class singleton public static singleton getuniqueinstance return uniqueinstance 我們都知道在synchronized可以保證變數的可見性和操作的原子性,此處volatile為什麼是必要的的呢?物件的建立可以...