標籤:bubuko href java記憶體模型 操作 對象 高並發 傳輸 知識 資料
JMM規範:
一.概念:規範了java虛擬機器與電腦記憶體如何協同工作,它規定了一個線程如何和何時可以看到其他線程修改過的共用變數的值,以及在必須時如何同步地訪問共用變數。
備忘:如果兩個線程同時調用了同一個對象的同一個方法,他們都會訪問這個對象的成員變數,此時這個兩個線程擁有的只是這個對象的私人拷貝。
二.八種同步操作
1、luck(鎖定):作用於主記憶體的變數,它把一個變數標示為一條線程獨佔的狀態。
2、unlock(解鎖):作用於主記憶體的變數,它把一個處於鎖定狀態的變數釋放出來,釋放後的變數才可以被其他線程鎖定。
3、read(讀取):作用於主記憶體的變數,它把一個變數的值從主記憶體傳輸到工作記憶體中,以便隨後的load動作使用。
4、load(載入):作用於工作記憶體的變數,它把read操作從主記憶體中得到的變數值放入工作記憶體的變數副本中。
5、use(使用):作用於工作記憶體的變數,它把工作記憶體中的一個變數的值傳遞給執行引擎,每當虛擬機器遇到一個需要使用到變數的值得位元組碼指令時將會執行這個操作。
6、assign(賦值):作用於工作記憶體的變數,它把一個從執行引擎接收到的值賦給工作記憶體的變數,每當虛擬機器遇到一個給變數賦值的位元組碼指令時執行這個操作。
7、store(儲存):作用於工作記憶體的變數,它把工作記憶體中的一個變數的值傳遞到主記憶體中,以便隨後的write操作使用。
8、write(寫入):作用於主記憶體的變數,它把store操作從工作記憶體中得到的變數值放入主記憶體的變數中。
三.對應的同步規則
1、不允許read和load、store和write單獨出現。即不允許一個變數從主記憶體讀取了但工作記憶體不接受,或者從工作內從發起會寫了但主記憶體不接受的情況出現。
2、不允許一個線程丟棄它的最近的assign操作,即變數在工作記憶體中改變了之後必須把該變化同步到主記憶體裡。
3、不允許一個線程無原因地把資料從線程工作記憶體同步回主記憶體中,即沒有發生過任何的assign操作就同步到主記憶體中。
4、一個新的變數只能在主記憶體中誕生,不允許在工作記憶體中直接使用一個沒有被初始化(load或assign)的變數,換句話說,就是對一個變數實施use、store操作之前,必須先執行assign和load操作。
5、一個變數在同一時刻,只允許一個線程對其進行loack操作,但lock操作可以被同一個線程重複執行多次,多次執行lock後,只有執行相同次數的unloack操作,變數才能被解鎖。
6、如果對一個變數執行了lock操作,那將會清空工作記憶體中此變數的值,在執行引擎使用這個變數前,需要重新執行load或assign操作初始設定變數的值。
7、如果一個變數事先沒有被lock伺服器用戶端檔案鎖,那就不允許對他執行unlock操作,也不允許去unlock一個被其他線程鎖定住的變數
8、對一個變數執行unlock操作之前,必須先把此變數同步回主記憶體中(執行store、write操作)。
四.操作與規則關係圖如下:
註:感謝慕課網jimin老師,做這個並發集合知識總結的初衷完全是因為看完他的《Java並發編程與高並發解決方案》產生的想法。
java並發知識合集(前置知識——java記憶體模型)