單例雙重鎖線程不安全

這一行分爲三步操作

1.分配內存空間

2.初始化對象

3.instance引用指向內存空間

 

正常執行順序1、2、3

重排序後執行順序可能爲1、3、2

線程A執行1、3後讓出cpu,此時還未執行2,別的線程拿到cpu,發現instance不爲null,直接返回使用,就會有問題,因爲instance還未初始化。

加上volatile可以防止指令重排序,使執行順序一定爲1、2、3,保證線程安全

參考:深入理解Java虛擬機370頁,雙重鎖線程不安全

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章