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