摘要:內存模型定義是一種規范,它規范了虛擬機與計算機內存之間是如何協同工作的,它規定了一個線程是如何和何時可以看到其它線程修改過的共享變量的值,以及如何同步共享變量的值。假設主內存中變量的值為,線程和同時執行。
Java內存模型(JMM)
定義:JMM是一種規范,它規范了Java虛擬機與計算機內存之間是如何協同工作的,它規定了一個線程是如何和何時可以看到其它線程修改過的共享變量的值,以及如何同步共享變量的值。
當一個線程可以訪問這個對象的時候,他也可以訪問這個對象的成員變量,如果兩個線程同時調用同一個對象上的同一個方法,他們將都會訪問這個對象的成員變量,但是每一個線程都擁有了這個變量的私有拷貝(變量副本)。
假設主內存中變量的值為1,線程A和B同時執行。線程A從主內存中拿到的值是1,存入自己的本地內存中,然后執行+1的操作結果為2,然后將2寫回主內存中。JMM - 線程同步的八種操作
同時線程B從主內存中拿到的值也是1,存入線程B的本地內存中+1結果也是2,寫入主內存,而不是讀取線程A的結果之后在進行計算,這兩個線程間的數據是不可見的,因此計數就出現了錯誤,這個時候就需要添加一些同步手段,來保證并發時程序處理的準確性。
lock(鎖定)
lock:作用于主內存的變量,把一個變量標示為一條線程獨占狀態
unlock(解鎖)
unlock:作用于主內存變量,把一個處于鎖定狀態的變量釋放出來,釋放后的變量才可以被其他線程鎖定
read(讀取)
read:作用于主內存變量,把一個變量值從主內存傳輸到線程的工作內存中,以便隨后的load動作使用
load(載入)
load:作用于工作內存的變量,他把read操作從主內存中得到的變量值放入工作內存的變量副本中
use(使用)
use:作用于工作內存變量,把工作內存中的一個變量值傳遞給執行引擎
assign(賦值)
assign:作用于工作內存變量,他把一個從執行引擎接收到的值賦值給工作內存變量
store(存儲)
store:作用于工作內存變量,把工作內存中的一個變量值傳遞到主內存中,一邊隨后的寫操作
write(寫入)
write:作用于主內存變量,他把store操作從工作內存中一個變量的值傳遞到主內存的變量中線程同步規則
如果要把一個變量從主內存復制到工作內存,就需要按順序的執行read和load操作,如果把變量從工作內存同步到主內存中,就要按順序執行store和write操作。但是Java內存模型只要求上述操作必須按順序執行,而沒有保證必須是連續執行不允許read和load、store和write多帶帶出現
不允許一個線程丟棄它的最近assign的操作,即變量在工作內存中改變了之后必須同步到主內存中
不允許一個線程無原因(沒有發生過任何assign操作)就把數據從工作內存同步到主內存中
一個新的變量只能在主內存中誕生,不允許在工作內存中直接使用一個未被初始化(load或assign)的變量。也就是對一個變量實施use和store操作之前,必須先執行過assign和load操作
一個變量在同一時刻只允許一條線程對其進行lock操作,但是lock操作可以被同一條線程重復執行多次,多次執行lock后,只執行相同次數的unlock操作,變量才會被解鎖。lock和unlock必須成對出現
如果對一個變量執行lock操作,將會清空工作內存中此變量的值,在執行引擎使用這個變量前需要重新執行load或assign操作初始化變量的值
如果一個變量事先沒有被lock鎖定,則不允許對他執行unlock操作,也不允許去unlock一個被其他線程鎖定的變量
對一個變量執行unlock操作之前,必須事先將此變量同步到主內存中(執行store和write)
過程圖解
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77566.html
摘要:編譯器,和處理器會共同確保單線程程序的執行結果與該程序在順序一致性模型中的執行結果相同。正確同步的多線程程序的執行將具有順序一致性程序的執行結果與該程序在順序一致性內存模型中的執行結果相同。 前情提要 深入理解Java內存模型(六)——final 處理器內存模型 順序一致性內存模型是一個理論參考模型,JMM和處理器內存模型在設計時通常會把順序一致性內存模型作為參照。JMM和處理器內...
摘要:前提深入理解內存模型程曉明著,該書在以前看過一遍,現在學的東西越多,感覺那塊越重要,于是又再細看一遍,于是便有了下面的讀書筆記總結。同步同步是指程序用于控制不同線程之間操作發生相對順序的機制。線程之間的通信由內存模型控制。 showImg(https://segmentfault.com/img/remote/1460000013474312?w=1920&h=1271); 前提 《深...
摘要:前提深入理解內存模型程曉明著,該書在以前看過一遍,現在學的東西越多,感覺那塊越重要,于是又再細看一遍,于是便有了下面的讀書筆記總結。同步同步是指程序用于控制不同線程之間操作發生相對順序的機制。線程之間的通信由內存模型控制。 showImg(https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6RtPu3BNx3zps1JhSmPICRw7QgeOmxOfTb...
摘要:內存模型對內存模型的介紹對內存模型的結構圖的線程之間的通信是通過共享內存的方式進行隱式通信,即線程把某狀態寫入主內存中的共享變量,線程讀取的值,這樣就完成了通信。 Java內存模型(JMM) 1.對內存模型的介紹 ①對Java內存模型的結構圖 java的線程之間的通信是通過共享內存的方式進行隱式通信,即線程A把某狀態寫入主內存中的共享變量X,線程B讀取X的值,這樣就完成了通信。是一種...
摘要:下面是該程序在兩個內存模型中的執行時序對比圖在順序一致性模型中,所有操作完全按程序的順序串行執行。不保證未同步程序的執行結果與該程序在順序一致性模型中的執行結果一致。 前情提要 深入理解Java內存模型(二)——重排序 數據競爭與順序一致性保證 當程序未正確同步時,就會存在數據競爭。java內存模型規范對數據競爭的定義如下: 在一個線程中寫一個變量, 在另一個線程讀同一個變量,...
閱讀 2770·2021-11-17 09:33
閱讀 3092·2021-10-25 09:44
閱讀 1200·2021-10-11 10:59
閱讀 2396·2021-09-27 13:34
閱讀 2905·2021-09-07 10:19
閱讀 2133·2019-08-29 18:46
閱讀 1535·2019-08-29 12:55
閱讀 928·2019-08-23 17:11