DCL(雙重校驗鎖)

2021-10-09 17:53:07 字數 543 閱讀 1691

單例模式

//餓漢模式

public class single

public static single getinstance()

}

//懶漢模式

public class single

public static single getinstance()

return instance;

}}

//dcl 雙重校驗加鎖

public class single

public static single getinstance()}}

return instance;

}}

new 的過程中 分為三步,1.分配記憶體空間,賦預設值  2.呼叫構造方法,3.建立引用

如果不指令重排 可能導致先建立引用,再呼叫構造方法。

那麼此時有其他執行緒來進行判斷,可能會取走未呼叫構造方法的物件,因此需要用 volatile防止指令重排序

單例雙重校驗鎖

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

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

public class single return null 因為如果不用volatile修飾的話,在 single new single 會發生指令重排序,single的 可以分解為三個部分 分配物件的記憶體空間 初始化物件 設定single指向記憶體空間 在jit裡,可能會將2與3進行重排序,...