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