這一行分爲三步操作
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頁,雙重鎖線程不安全
這一行分爲三步操作
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頁,雙重鎖線程不安全