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內存模型與線程