1. 程式人生 > >8-DCL double-check locks(指令重排序導致的非執行緒安全問題)

8-DCL double-check locks(指令重排序導致的非執行緒安全問題)

  1. DCL double-check locks(指令重排序導致的非執行緒安全問題)
    1. 單例模式1: 非執行緒安全模式

問題:多執行緒環境下,可能多個執行緒singleton == null,導致new多個例項物件

    1. 單例模式2:synchronized修改方法塊

問題:併發比較高的情況下,速率很慢

    1. 單例模式3:DCL模式:檢查-加鎖-檢查

instance = new Singleton() 分為:1-分配記憶體空間,2-初始化物件,3-設定instance指向記憶體地址;

指令重排序:

單執行緒環境下,由於2-3沒有資料依賴關係,故可能存在1-2-3 以及 1-3-2兩種情況;

假定,某個執行緒按照1-3-2執行完成第3步,而另外一個執行緒,進行DCL的外層檢查,發現沒有問題,可能會返回一個未完全例項化的物件

    1. 最終版:單例模式4:volatile變數禁止指令重排序,讓DCL生效

    1. 常用的單例模式:類初始化時完成例項化

多執行緒學習大綱:https://mp.csdn.net/postedit/84768644