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