DCL雙檢查鎖機制實現執行緒安全的單例設計模式

2021-09-25 08:04:19 字數 1223 閱讀 1671

實現執行緒安全的單例設計模式的三種方式

1、普通(懶漢式)單例模式,在多執行緒情況下會存在被多次例項化問題

public class myobject 

public static myobject getinstance()

return myobject;

}}

2、對getinstance()方法進行加鎖,防止多個執行緒同時進入,解決了執行緒安全問題,但是效率太低

public class myobject 

synchronized public static myobject getinstance()

return myobject;

}}

3、「不安全的」雙檢查鎖機制實現,存在物件部分構造問題

public class myobject 

public static myobject getinstance() }}

return myobject;

}}

**中乙個執行緒正在例項化物件,但是還沒有完全完成初始化,這時候另外乙個執行緒進來,得到的判斷是myobject != null,拿到myobject後去執行下面的邏輯,此種情況下會出現空指標異常

出現部分構造問題是因為jvm無序寫入造成的。

乙個物件的建立過程是:

(1)、分配物件記憶體空間。

(2)、呼叫singleton的構造方法進行建構函式初始化

(3)、將instance指向分配的記憶體空間

(4)、訪問inte***ce引用的物件

但是因為jvm亂序執行上面2、3步驟,有可能2、3,有可能3、2,如果3、2,則就有可能會出現問題,因為執行3時,物件已經為非null了,假設此時有兩個執行緒a、b,a執行到1、3,2還未執行,此時b執行緒訪問此物件,得到物件已非空,但是實際上a執行緒中的物件還未建立完。

4、使用「volatile」關鍵字的解決方案

public class myobject 

public static myobject getinstance() }}

return myobject;

}}

volatile可以阻止程式的亂序執行,因為volatile會給程式新增記憶體屏障從而阻止編譯器或者處理器對**的亂序執行,從而使雙重檢驗鎖在多執行緒下具有正確執行。 

雙重檢查鎖實現執行緒安全式的懶漢單例模式

public class singleton public static singleton getuniqueinstance return uniqueinstance 上面的 中,建立乙個私有的構造方法,避免外部建立類的示例 然後定義乙個靜態的類的例項,外部通過getuniqueinstanc...

讀寫鎖實現執行緒安全快取

讀寫鎖 可以多執行緒讀,但只有乙個執行緒寫入 並且寫入的時候不能讀取,讀取的時候不能寫入。具體 如下 測試 public class testreadandwritelock for int i 0 i 100 i console.readline public void taskadd int i...

執行緒安全的實現方式以及鎖優化。

執行緒安全的實現方式 1.互斥同步。臨界區 訊號量 互斥量都是互斥同步的手段。2.非阻塞同步。cas結合不斷重試 3.無鎖 沒有共享資料的時候。鎖優化 1.鎖自旋和自適應自旋 在等待鎖的時候不去掛起執行緒,而是執行乙個忙迴圈,缺點是消耗處理器資源。2.鎖消除。3.鎖粗化 自動擴大使用鎖的範圍 4.輕...