JMM
- 1.用工作內(nèi)存和主內(nèi)存萎胰,可以類比之前的cpu的高速緩存和主內(nèi)存闻坚。
主內(nèi)存和工作內(nèi)存交互需要的八種操作
lock
- 1.作用于主內(nèi)存,把變量標(biāo)識(shí)為一條線程獨(dú)占的狀態(tài)逝她。
unlock
- 1.作用于主內(nèi)存的變量浇坐,它把一個(gè)處于鎖定狀態(tài)的變量釋放出來(lái),只有釋放后的變量才可以被其他線程鎖定黔宛。
read
- 1.作用于主內(nèi)存的變量近刘,把一個(gè)變量的值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存,以便后面的load
load
- 1.作用于工作內(nèi)存的變量,他把read得到變量值放入到工作內(nèi)存的變量副本中觉渴。
use
- 1.作用于工作內(nèi)存的變量介劫,它把工作內(nèi)存中的變量的傳遞給執(zhí)行引擎,當(dāng)JVM執(zhí)行需要使用變量值的字節(jié)碼指令時(shí)候就會(huì)使用USE操作案淋。
assign
- 1.作用于工作內(nèi)存的變量座韵,它把一個(gè)從執(zhí)行引擎接受到的值賦值給工作內(nèi)存的變量,JVM遇到給變量賦值的字節(jié)碼指令時(shí)就會(huì)這樣執(zhí)行.
store
- 1.作用于工作內(nèi)存的變量踢京,他把工作內(nèi)存中的一個(gè)變量傳送到主內(nèi)存從誉碴,以便隨后的write
write
- 1.作用于主內(nèi)存的變量,他把store操作從工作內(nèi)存得到的變量值放入主內(nèi)存的變量中瓣距。
總結(jié)可以通過(guò)lock獲取對(duì)變量的操作權(quán)限黔帕,通過(guò)unlock釋放,通過(guò)read先把變量讀取到工作內(nèi)存蹈丸,然后通過(guò)load把變量值放入到工作內(nèi)存中的變量副本成黄。
我們使用變量進(jìn)行操作(use),給變量賦值(assign)白华,通過(guò)store把工作內(nèi)存中的變量值傳遞到主內(nèi)存慨默,通過(guò)write把該值寫(xiě)入到主內(nèi)存中的變量。
上述操作必須滿足的規(guī)則
read 和load弧腥,store和write必須成對(duì)出現(xiàn)厦取,且順序如當(dāng)前所示,但是不需要連續(xù)執(zhí)行比如read和load之間可以插入其他的指令管搪。
不允許一個(gè)線程丟棄它最近的assign的操作虾攻,最近是指最后一次的賦值,賦值之后的改變必須同步回主內(nèi)存更鲁。
不允許一個(gè)線程無(wú)原因地(沒(méi)有發(fā)生過(guò)任何assign操作的)把數(shù)據(jù)從線程的工作內(nèi)存同步回主內(nèi)存霎箍。
一個(gè)新的變量只能在主內(nèi)存中誕生,對(duì)一個(gè)變量使用store和use之前必須先使用load和assign
一個(gè)變量只能在同一時(shí)刻被一個(gè)線程鎖定澡为,但是lock操作可以被同一個(gè)線程重復(fù)執(zhí)行多次漂坏,但是對(duì)應(yīng)的unlock也需要執(zhí)行相同次數(shù)。
對(duì)變量執(zhí)行l(wèi)ock操作媒至,將會(huì)清空工作內(nèi)存中此變量的值顶别,在執(zhí)行引擎使用此變量前,需要重新執(zhí)行l(wèi)oad或assign操作初始化變量的值拒啰。
未被lock的變量不允許unlock
對(duì)一個(gè)變量執(zhí)行unlock操作之前驯绎,必須把此變量同步回主內(nèi)存中(執(zhí)行store和write操作)
上述的操作是指jvm規(guī)定對(duì)一個(gè)主內(nèi)存操作的時(shí)候需要進(jìn)行的步驟,其中l(wèi)ock和unlock可以通過(guò)字節(jié)碼指令和咱們的并發(fā)包谋旦,而對(duì)于lock和unlock對(duì)變量的操作底層涉及到內(nèi)存屏障
JMM主要是圍繞并發(fā)過(guò)程中的原子剩失,有序屈尼,可見(jiàn)性
原子性
- 1.保證了read,load,assign,use,store和write對(duì)變量的原子操作拴孤,如果想保證代碼塊的原子性脾歧,可以使用lock和unlock
可見(jiàn)性
- JMM把修改的值同步主內(nèi)存則使得其他線程可以看到
- voliatile則通過(guò)內(nèi)存屏障使得立即可見(jiàn)
- synchronized 也是同樣的道理
有序
- voliatile 禁止重排序
- synchronized則是一個(gè)時(shí)間只允許一個(gè)線程執(zhí)行,所以可以有順序(因?yàn)閱尉€程則從一個(gè)線程看是有順序的)