volatile的非原子性說明


volatile時的運行過程:子線程操作主線程對象變量時,會通過引用在堆內存中找到該對象的變量值並複製到自己的線程棧內存中,接下來子線程的操作就和主線程無關了,無論主線程對象變量是否發生變化,它只會讀取和操作子線程內存的變量副本,最後將結果賦值給主線程對象的變量。


有volatile時的運行過程:子線程操作主線程對象變量時,會通過引用在堆內存中找到該對象的變量值並複製到自己的線程棧內存中,當主線程對象變量變化時,子線程則會讀取最新的主線程變量值將之賦給變量副本,這樣就保證了子線程獲取的值是最新的,也就等同於線程間變量可見但它無法給變量加鎖,無法確保同一時間只能一個線程更改對象變量,因此沒有原子性,不能保證數據的準確。






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