Volatile關鍵字


在多線程環境下,volatile關鍵字可以保證可見性和有序性,無法保證原子性。

內存模型

計算機系統:Cpu—高速緩存—主內存
JVM:Cpu—工作內存—主內存

緩存一致性問題

待處理的數據並非是主內存中的原型,而是一個副本,在多線程場景下,這個副本的處理結果很有可能會失控。這個問題也就是緩存一致性問題,即cache和主內存數據同步問題。目前我知道解決緩存一致性問題有兩種方案:

  • 通過在總線加LOCK鎖
    是通過獨佔CPU方式實現,同一時間只有一個CPU在運行,效率低下。
  • 通過緩存一致性協議
    允許多核處理,並且讓共享副本在線程之間具有可見性。

線程執行過程說明

線程執行過程:
從主存中read變量 —> load到工作內存中的副本中 —> 傳給cpu處理 —> 結果write到工作內存副本中 —> 副本值傳回給主存

在這裏插入圖片描述

上圖中第3步實現了volatile的可見性,別的線程在接到通知時,會重新從主存加載變量。
可見性只針對當cpu從主存中加載共享變量的時候。

由上述說明,不難看出,若線程1在執行第三步時,還未來得及執行第四步;線程2開始從主存中加載數據,此時,就出現了併發問題;這種情況說明volatile不能保證操作的原子性

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