JMM的理解學(xué)習(xí)

      網(wǎng)友投稿 789 2025-03-31

      1.JMM的定義

      JMM是JAVA 的內(nèi)存模型(java memory model),不存在的東西,是一種概念或者約定,規(guī)定了內(nèi)存主要?jiǎng)澐譃橹鲀?nèi)存和工作內(nèi)存兩種。而所規(guī)定的主內(nèi)存和工作內(nèi)存跟JVM內(nèi)存劃分(堆、棧、方法區(qū))是在不同的層次上進(jìn)行的,但是用類比的方法可以將主內(nèi)存類比為Java堆中的對(duì)象實(shí)例部分,工作內(nèi)存類比為棧中的部分區(qū)域,從更底層的來說,主內(nèi)存對(duì)應(yīng)的是硬件的物理內(nèi)存,工作內(nèi)存對(duì)應(yīng)的則是寄存器和高速緩存

      為什么我們要定義這么一個(gè)規(guī)則呢?是因?yàn)樵诓煌挠布a(chǎn)商和不同的操作系統(tǒng)下,內(nèi)存的訪問邏輯是有一定的差異的,即當(dāng)代碼在某個(gè)系統(tǒng)環(huán)境下運(yùn)行正常并且線程安全,但是換了個(gè)系統(tǒng)就出現(xiàn)了各種的問題。Java內(nèi)存模型(JMM)應(yīng)就這樣運(yùn)而生,為了屏蔽系統(tǒng)和硬件的差異,讓一套代碼在不同平臺(tái)下能到達(dá)相同的訪問結(jié)果。

      2.關(guān)于JMM的同步約定

      2.1線程解鎖前

      必須把共享變量立刻刷回主內(nèi)存(因?yàn)榫€程在處理變量的時(shí)候是,復(fù)制了一份在自己的線程的工作內(nèi)存中進(jìn)行處理,此處意思是將自己線程中的變量立刻刷回主存中,讓線程的工作內(nèi)存中和主存中的變量保持一致)

      2.2 線程加鎖前

      必須讀取主內(nèi)存中的最新值更新到工作內(nèi)存中,也是為了讓工作內(nèi)存中的變量和線程中保持一致。

      2.3 加鎖和解鎖是必須同一把鎖(不是同一把鎖的話,大家就各玩各的了,沒辦法一塊愉快玩耍了)。

      3.JMM的八種交互操作

      JMM交互操作共有8種(在主存和工作內(nèi)存之間進(jìn)行的操作)并且虛擬機(jī)實(shí)現(xiàn)必須保證每一個(gè)操作都是原子的,不可在分的。方法如下:

      3.1 lock

      加鎖操作,作用于主內(nèi)存的變量,把一個(gè)變量標(biāo)識(shí)為線程獨(dú)占狀態(tài);

      3.2 unlock

      解鎖操作,作用于主內(nèi)存的變量,把一個(gè)處于鎖定狀態(tài)的變量釋放出來,釋放后的變量才能被其他線程鎖定;

      3.3 read

      從主存中讀取操作,作用于主內(nèi)存變量,把一個(gè)變量的值從主內(nèi)存讀取到線程的工作內(nèi)存中,以便隨后的load動(dòng)作使用;

      3.4 load

      將主存中讀取的數(shù)據(jù)寫入工作內(nèi)存的加載寫入操作,作用于工作內(nèi)存的變量,把read操作讀取的變量從主存中放入工作內(nèi)存中;

      3.5 use

      執(zhí)行引擎使用加載到工作內(nèi)存中的數(shù)據(jù)的操作,作用于工作內(nèi)存中的變量,把工作內(nèi)存中的變量傳輸給執(zhí)行引擎,當(dāng)虛擬機(jī)遇到需要使用到變量的值就會(huì)使用這個(gè)指令;

      3.6 assign

      JMM的理解學(xué)習(xí)

      執(zhí)行引擎將use使用操作后的數(shù)據(jù)再賦值回工作內(nèi)存的賦值操作,作用于工作內(nèi)存中的變量,把從執(zhí)行引擎中接受到的值放入工作內(nèi)存的變量副本中;

      3.7 store

      將assign賦值到工作內(nèi)存后進(jìn)行的讀取操作(準(zhǔn)備再寫入到主內(nèi)存中),作用于主內(nèi)存中的變量,把從工作內(nèi)存中變量的值傳送到主內(nèi)存中,以便后續(xù)的write操作使用;

      3.8 write

      將從工作內(nèi)存中通過store讀取操作讀取的數(shù)據(jù)寫入到主內(nèi)存的寫入操作,作用于主內(nèi)存中的變量,把store操作從工作內(nèi)存中得到的變量的值放入主內(nèi)存的變量中;

      4.JMM對(duì)這八種操作的使用制定的規(guī)則

      4.1 不允許read和load、store和write操作之一單獨(dú)出現(xiàn),必須成雙成對(duì)不能分開~

      4.2 不允許線程丟棄其最近的assign操作,即工作內(nèi)存中的變量數(shù)據(jù)發(fā)生改變之后必須告知主內(nèi)存;

      4.3 不允許線程將沒有assign操作的數(shù)據(jù)從工作內(nèi)存同步回主內(nèi)存;

      4.4 不允許工作內(nèi)存直接使用一個(gè)未被初始化的變量,新的變量必須在主內(nèi)存中誕生,即use操作之前必須經(jīng)過load操作或者或者store操作之前必須經(jīng)過assign操作;

      4.5 一個(gè)變量同一時(shí)間只有一個(gè)線程能對(duì)其進(jìn)行l(wèi)ock加鎖操作,多次lock加鎖操作后,必須執(zhí)行相同次數(shù)的unlock解鎖操作才能解鎖;

      4.6 如果對(duì)一個(gè)變量進(jìn)行l(wèi)ock操作,會(huì)清空所有工作內(nèi)存中此變量的值,在執(zhí)行引擎使用這個(gè)變量前,必須重新load或assign操作初始化變量的值;

      4.7 如果一個(gè)變量沒有被lock加鎖操作,就不能對(duì)其進(jìn)行unlock解鎖操作,也不能unlock解鎖一個(gè)被其他線程加鎖操作鎖住的變量;

      4.8 對(duì)一個(gè)變量進(jìn)行unlock解鎖操作之前,必須把此變量同步回主內(nèi)存;

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:更多的視覺檢測(cè)技術(shù)將應(yīng)用在汽車生產(chǎn)制造領(lǐng)域
      下一篇:哪個(gè)OKR軟件最強(qiáng)(okr用什么軟件好)
      相關(guān)文章
      亚洲国产成a人v在线| 亚洲精品美女视频| 亚洲色图激情文学| 亚洲无圣光一区二区| 激情内射亚洲一区二区三区| 亚洲大尺度无码无码专区| 国产亚洲精品激情都市| 狠狠亚洲婷婷综合色香五月排名| 亚洲男人的天堂在线va拉文| 国产精品成人亚洲| 亚洲JIZZJIZZ中国少妇中文| 亚洲福利精品电影在线观看| 亚洲Av无码乱码在线播放| 亚洲国产主播精品极品网红 | 亚洲区小说区图片区| 亚洲国产精品专区在线观看| 亚洲成?Ⅴ人在线观看无码| 久久久久亚洲AV成人网人人网站| 亚洲人成色77777在线观看大| 亚洲综合色在线观看亚洲| 亚洲中文字幕无码永久在线| 在线亚洲午夜理论AV大片| 亚洲国产一成人久久精品| 久久精品国产亚洲av麻豆| 久久久久亚洲AV无码专区首JN| 亚洲综合一区二区| 亚洲毛片基地日韩毛片基地| 亚洲一区二区三区免费在线观看| 97se亚洲国产综合自在线| 亚洲成a人无码亚洲成www牛牛| 无码一区二区三区亚洲人妻| 亚洲精品国产成人影院| 亚洲午夜久久久影院| 亚洲国产精品一区二区久久hs | 亚洲AⅤ男人的天堂在线观看| 国产精品亚洲综合一区在线观看| 毛片亚洲AV无码精品国产午夜| 亚洲综合色视频在线观看| 亚洲va久久久噜噜噜久久天堂| 亚洲视频在线观看一区| 亚洲一级视频在线观看|