使用volatile關鍵字的原因

使用volatile關鍵字的原因有三個:

 

1.編譯器爲了提高速度將一個變量緩存到寄存器內不寫回。在多線程的情況下,雖然加了同步鎖,但由於這個原因而導致共享數據的值與預期的值不同。

2.編譯器或者CPU爲了提高效率,有可能交換指令的順序,造成錯誤。比如在創建一個對象時,p = new T;由於這個語句編譯後產生很多彙編語句,有三句。
1)分配內存
2)在內存的位置上調用構造函數
3)將內存的地址賦值給p
第2步和第3步可以被CPU或者編譯器在編譯的時候調換順序。會產生對象還沒被完全構造成功的情況。

 

所以產生了volatile關鍵字。有2個作用;
1)阻止編譯器爲了提高速度將一個變量緩存到寄存器。
2)阻止編譯器調整操作volatile變量的指令順序。

 

但使用volatile變量並不能解決上述的第二個問題,因爲儘管編譯器沒有調整volatile的指令順序,但是CPU仍然是亂序執行的。同樣會造成這個問題。所以要用到barrier指令,該指令阻止CPU將該指令之前的指令交換到barrier之後,反之亦然。

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