定義:JMM是一種規範,它規範了Java虛擬機與計算機內存之間是如何協同工做的,它規定了一個線程是如何和什麼時候能夠看到其它線程修改過的共享變量的值,以及如何同步共享變量的值。
當一個線程能夠訪問這個對象的時候,他也能夠訪問這個對象的成員變量,若是兩個線程同時調用同一個對象上的同一個方法,他們將都會訪問這個對象的成員變量,可是每個線程都擁有了這個變量的
私有拷貝
(變量副本)。
假設主內存中變量的值爲1,線程A和B同時執行。線程A從主內存中拿到的值是1,存入本身的本地內存中,而後執行+1的操做結果爲2,而後將2寫回主內存中。
同時線程B從主內存中拿到的值也是1,存入線程B的本地內存中+1結果也是2,寫入主內存,而不是讀取線程A的結果以後在進行計算,這兩個線程間的數據是不可見的,所以計數就出現了錯誤,這個時候就須要添加一些同步手段,來保證併發時程序處理的準確性。
lock(鎖定)併發
lock:做用於主內存的變量,把一個變量標示爲一條線程獨佔狀態
unlock(解鎖)spa
unlock:做用於主內存變量,把一個處於鎖定狀態的變量釋放出來,釋放後的變量才能夠被其餘線程鎖定
read(讀取)線程
read:做用於主內存變量,把一個變量值從主內存傳輸到線程的工做內存中,以便隨後的load動做使用
load(載入)code
load:做用於工做內存的變量,他把read操做從主內存中獲得的變量值放入工做內存的變量副本中
use(使用)對象
use:做用於工做內存變量,把工做內存中的一個變量值傳遞給執行引擎
assign(賦值)ip
assign:做用於工做內存變量,他把一個從執行引擎接收到的值賦值給工做內存變量
store(存儲)內存
store:做用於工做內存變量,把工做內存中的一個變量值傳遞到主內存中,一邊隨後的寫操做
write(寫入)同步
write:做用於主內存變量,他把store操做從工做內存中一個變量的值傳遞到主內存的變量中
若是要把一個變量從主內存複製到工做內存,就須要按順序的執行read和load操做,若是把變量從工做內存同步到主內存中,就要按順序執行store和write操做。可是Java內存模型只要求上述操做必須按順序執行,而沒有保證必須是連續執行不容許read和load、store和write單獨出現虛擬機
不容許一個線程丟棄它的最近assign的操做,即變量在工做內存中改變了以後必須同步到主內存中it
不容許一個線程無緣由(沒有發生過任何assign操做)就把數據從工做內存同步到主內存中
一個新的變量只能在主內存中誕生,不容許在工做內存中直接使用一個未被初始化(load或assign)的變量。也就是對一個變量實施use和store操做以前,必須先執行過assign和load操做
一個變量在同一時刻只容許一條線程對其進行lock操做,可是lock操做能夠被同一條線程重複執行屢次,屢次執行lock後,只執行相同次數的unlock操做,變量纔會被解鎖。lock和unlock必須成對出現
若是對一個變量執行lock操做,將會清空工做內存中此變量的值,在執行引擎使用這個變量前須要從新執行load或assign操做初始化變量的值
若是一個變量事先沒有被lock鎖定,則不容許對他執行unlock操做,也不容許去unlock一個被其餘線程鎖定的變量
對一個變量執行unlock操做以前,必須事先將此變量同步到主內存中(執行store和write)
過程圖解