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

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

1. Java內存模型規定在多線程狀況下,線程操做主內存變量,須要經過線程獨有的工做內存拷貝主內存變量副原本進行。此處的所謂內存模型要區別於一般所說的虛擬機堆模型:多線程

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

原子操做的規則(部分):線程

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

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

3) 不能丟失變量最後一次assign操做的副本,即遍歷最後一次assign的副本必需要回寫到MainMemory中。內存

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

3. volatile關鍵字it

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

1) 變量的修改對全部線程可見bfc

理解:

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

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

2)禁止指令重排

 

參考:

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

相關文章
相關標籤/搜索