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...