8-DCL double-check locks(指令重排序導致的非執行緒安全問題)
阿新 • • 發佈:2018-12-05
- DCL double-check locks(指令重排序導致的非執行緒安全問題)
- 單例模式1: 非執行緒安全模式
問題:多執行緒環境下,可能多個執行緒singleton == null,導致new多個例項物件
-
- 單例模式2:synchronized修改方法塊
問題:併發比較高的情況下,速率很慢
-
- 單例模式3:DCL模式:檢查-加鎖-檢查
instance = new Singleton() 分為:1-分配記憶體空間,2-初始化物件,3-設定instance指向記憶體地址;
指令重排序:
單執行緒環境下,由於2-3沒有資料依賴關係,故可能存在1-2-3 以及 1-3-2兩種情況;
假定,某個執行緒按照1-3-2執行完成第3步,而另外一個執行緒,進行DCL的外層檢查,發現沒有問題,可能會返回一個未完全例項化的物件
-
- 最終版:單例模式4:volatile變數禁止指令重排序,讓DCL生效
-
- 常用的單例模式:類初始化時完成例項化