Java線程工作內存與主內存變量交換過程及volatile關鍵字理解


Java線程工作內存與主內存變量交換過程及volatile關鍵字理解

1. Java內存模型規定在多線程情況下,線程操作主內存變量,需要通過線程獨有的工作內存拷貝主內存變量副本來進行。此處的所謂內存模型要區別於通常所說的虛擬機堆模型:

2. 線程獨有的工作內存和進程內存(主內存)之間通過8中原子操作來實現,如下圖所示:

原子操作的規則(部分):

1) read,load必須連續執行,但是不保證原子性。

2) store,write必須連續執行,但是不保證原子性。

3) 不能丟失變量最后一次assign操作的副本,即遍歷最后一次assign的副本必須要回寫到MainMemory中。

其它規則詳見《深入理解Java虛擬機》第12章 Java內存模型與線程

3. volatile關鍵字

定義為volatile類型的變量擁有兩種語義:

1) 變量的修改對所有線程可見

理解:

  線程中每次use變量時,都需要連續執行read->load->use幾項操作,即所謂的每次使用都要從主內存更新變量值,這樣其它線程的修改對該線程就是可見的。

  線程每次assign變量時,都需要連續執行assign->store->write幾項操作,即所謂每次更新完后都會回寫到主內存,這樣使得其它線程讀到的都是最新數據。

2)禁止指令重排

 

參考:

《深入理解Java虛擬機》第12章 Java內存模型與線程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM