雙重校驗鎖 為啥要用volatile修飾

2021-08-31 03:34:41 字數 591 閱讀 2582

public class single }}

return null;

}}

因為如果不用volatile修飾的話,在 single=new single();會發生指令重排序,

single的**可以分解為三個部分

分配物件的記憶體空間

初始化物件

設定single指向記憶體空間

在jit裡,可能會將2與3進行重排序,在單執行緒裡這裡並不會發生什麼問題,但是在多執行緒情況下,會出現下面的問題

時間執行緒a

執行緒bt1

a1:分配物件的記憶體空間

t2a3:設定single指向記憶體空間

t3b1:判斷single是否為空

t4b2:由於single不為null,執行緒b將訪問single引用的物件

t5a2:初始化該物件

t6a4:訪問single引用的物件

a2與a3重排序後,會讓執行緒b在b1處判斷出single不為null,執行緒b接下來將訪問的single引用的物件是乙個未初始化的物件。

所以用volatile修飾 single來就是禁止2與3的重排序,來保證執行緒安全的延遲初始化。

DCL(雙重校驗鎖)

單例模式 餓漢模式 public class single public static single getinstance 懶漢模式 public class single public static single getinstance return instance dcl 雙重校驗加鎖 pu...

單例雙重校驗鎖

public class singledoublelock 1 第一次校驗 因為該類是單例的只建立一次,大部分時間single都不為空,所以不會進行第一次檢驗的 塊內部,從而提高效率 2 第二次校驗 如果single為空,執行緒t1,t2進入第一次檢驗的 塊,t1執行synchronized 塊 n...

單例模式 雙重校驗鎖

單例模式 雙重校驗鎖 author szekinwin public class singleton3 私有化構造方法 private static volatile singleton3 singleton null public static singleton3 getinstance ret...