java內(nèi)存模型

一导披、現(xiàn)代計算機(jī)物理內(nèi)存模型

Java內(nèi)存模型規(guī)定了JVM如何基于計算機(jī)內(nèi)存工作梗劫。JVM就是一個完整的計算機(jī)模型因此這個模型中包含一個內(nèi)存模型

現(xiàn)代計算機(jī)的內(nèi)存與處理器的運(yùn)算能力之間有幾個數(shù)量級的差距蝌借,所以現(xiàn)代計算機(jī)系統(tǒng)加入讀寫速度盡可能接近處理器運(yùn)算速度的高速緩存(L1匣距、L2、L3三級緩存容量依此增大,速度依此降低)來作為內(nèi)存與處理器之間的緩沖:將運(yùn)算需要使用到的數(shù)據(jù)復(fù)制到緩存中,讓運(yùn)算能快速進(jìn)行,當(dāng)運(yùn)算結(jié)束后再從緩存同步回內(nèi)存之中這樣處理器就無需等待緩慢的內(nèi)存讀寫了尺栖。

基于高速緩存的存儲交互很好地解決了處理器與內(nèi)存的速度差異矛盾,但同是引入了一個新的問題:緩存一致性烦租。在多處理器系統(tǒng)中延赌,每個處理器都有自己的高速緩存,而他們又共享同一主存叉橱,如下圖所示:多個處理器運(yùn)算任務(wù)都涉及同一塊主存挫以,需要一種協(xié)議可以保障數(shù)據(jù)的一致性,這類協(xié)議有MSI窃祝、MESI掐松、MOSI及Dragon Protocol等》嘈。總而言之大磺,緩存一致性解決了緩存中的數(shù)據(jù)同步到主內(nèi)存中數(shù)據(jù)一致性。

JMM物理內(nèi)存模型

1.并發(fā)編程需要解決的關(guān)鍵問題

  • 線程通信
    線程間以什么機(jī)制來交換信息
  • 線程同步
    程序用于控制不同線程間操作發(fā)生相對順序的機(jī)制

2.java解決并發(fā)編程的方法

Java的并發(fā)采用的是共享內(nèi)存模型探膊。

  • 線程通信

    線程之間共享程序的公共狀態(tài)杠愧,線程之間通過寫-讀內(nèi)存中的公共狀態(tài)來進(jìn)行隱式通信。

  • 線程同步

    程序必須顯示地指定某個方法或某段代碼需要在線程之間互斥逞壁。

3.JMM內(nèi)存交互

Java內(nèi)存模型定義了以下八種操作來完成流济,如下圖所示:

JMM內(nèi)存交互操作
  • lock(鎖定):作用于主內(nèi)存的變量,把一個變量標(biāo)識為一條線程獨(dú)占狀態(tài)猾担。

  • unlock(解鎖):作用于主內(nèi)存變量,把一個處于鎖定狀態(tài)的變量釋放出來刺下,釋放后的變量才可以被其他線程鎖定绑嘹。

  • read(讀取):作用于主內(nèi)存變量,把一個變量值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中橘茉,以便隨后的load動作使用工腋。

  • load(載入):作用于工作內(nèi)存的變量,它把read操作從主內(nèi)存中得到的變量值放入工作內(nèi)存的變量副本中畅卓。

  • use(使用):作用于工作內(nèi)存的變量擅腰,把工作內(nèi)存中的一個變量值傳遞給執(zhí)行引擎,每當(dāng)虛擬機(jī)遇到一個需要使用變量的值的字節(jié)碼指令時將會執(zhí)行這個操作翁潘。

  • assign(賦值):作用于工作內(nèi)存的變量趁冈,它把一個從執(zhí)行引擎接收到的值賦值給工作內(nèi)存的變量,每當(dāng)虛擬機(jī)遇到一個給變量賦值的字節(jié)碼指令時執(zhí)行這個操作。

  • store(存儲):作用于工作內(nèi)存的變量渗勘,把工作內(nèi)存中的一個變量的值傳送到主內(nèi)存中沐绒,以便隨后的write的操作。

  • write(寫入):作用于主內(nèi)存的變量旺坠,它把store操作從工作內(nèi)存中一個變量的值傳送到主內(nèi)存的變量中乔遮。

JMM對8種內(nèi)存交互操作制定的規(guī)則:

  • 不允許read、load取刃、store蹋肮、write操作之一單獨(dú)出現(xiàn),也就是read操作后必須load璧疗,store操作后必須write坯辩。

  • 不允許線程丟棄他最近的assign操作,即工作內(nèi)存中的變量數(shù)據(jù)改變了之后病毡,必須告知主存濒翻。

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

  • 一個新的變量必須在主內(nèi)存中誕生啦膜,不允許工作內(nèi)存直接使用一個未被初始化的變量有送。就是對變量實施use、store操作之前僧家,必須經(jīng)過load和assign操作雀摘。

  • 一個變量同一時間只能有一個線程對其進(jìn)行l(wèi)ock操作。多次lock之后八拱,必須執(zhí)行相同次數(shù)unlock才可以解鎖阵赠。

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

  • 如果一個變量沒有被lock爹谭,就不能對其進(jìn)行unlock操作枷邪。也不能unlock一個被其他線程鎖住的變量。

  • 一個線程對一個變量進(jìn)行unlock操作之前诺凡,必須先把此變量同步回主內(nèi)存东揣。

4. 線程/工作內(nèi)存/主內(nèi)存 三者的關(guān)系

  • 每個線程都有一個獨(dú)立的工作內(nèi)存,用于存儲線程私有的數(shù)據(jù)

  • Java內(nèi)存模型中規(guī)定所有變量都存儲在主內(nèi)存腹泌,主內(nèi)存是共享內(nèi)存區(qū)域嘶卧,所有線程都可以訪問

  • 線程對變量的操作(讀取賦值等)必須在工作內(nèi)存中進(jìn)行。(線程安全問題的根本原因)

  • 主內(nèi)存是在運(yùn)行期間所有變量的存放區(qū)域凉袱,當(dāng)工作內(nèi)存是運(yùn)行期間中某一線程獨(dú)立私有的內(nèi)存存放區(qū)域

  • 線程間無法訪問對方的工作內(nèi)存空間芥吟,都是通過主內(nèi)存交換來實現(xiàn)

  • 主內(nèi)存的變量在工作內(nèi)存中的值是復(fù)制過去的副本,讀寫完成后刷新主內(nèi)存,這意味著主內(nèi)存如果發(fā)生了改變运沦,工作內(nèi)存并無法獲得最新的結(jié)果

  • 多個線程對一個共享變量進(jìn)行修改時泵额,都是對自己工作內(nèi)存的副本進(jìn)行操作,相互不可見携添。主內(nèi)存最后得到的結(jié)果是不可預(yù)知的嫁盲。

參考文章:

[(翻譯)JVM——Java物理內(nèi)存模型(JMM)及運(yùn)行時內(nèi)存模型]https://blog.csdn.net/cheya3213/article/details/100595911

https://blog.csdn.net/scyatcs/article/details/77532966

https://www.cnblogs.com/czwbig/p/11127124.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市烈掠,隨后出現(xiàn)的幾起案子羞秤,更是在濱河造成了極大的恐慌,老刑警劉巖左敌,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘾蛋,死亡現(xiàn)場離奇詭異,居然都是意外死亡矫限,警方通過查閱死者的電腦和手機(jī)哺哼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叼风,“玉大人取董,你說我怎么就攤上這事∥匏蓿” “怎么了茵汰?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長孽鸡。 經(jīng)常有香客問我蹂午,道長,這世上最難降的妖魔是什么彬碱? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任豆胸,我火速辦了婚禮,結(jié)果婚禮上巷疼,老公的妹妹穿的比我還像新娘晚胡。我一直安慰自己,他們只是感情好皮迟,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布搬泥。 她就那樣靜靜地躺著桑寨,像睡著了一般伏尼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尉尾,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天爆阶,我揣著相機(jī)與錄音,去河邊找鬼。 笑死辨图,一個胖子當(dāng)著我的面吹牛班套,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播故河,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吱韭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鱼的?” 一聲冷哼從身側(cè)響起理盆,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凑阶,沒想到半個月后猿规,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宙橱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年姨俩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片师郑。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡环葵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呕乎,到底是詐尸還是另有隱情积担,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布猬仁,位于F島的核電站帝璧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏湿刽。R本人自食惡果不足惜的烁,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诈闺。 院中可真熱鬧渴庆,春花似錦、人聲如沸雅镊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仁烹。三九已至耸弄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卓缰,已是汗流浹背计呈。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工砰诵, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捌显。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓茁彭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扶歪。 傳聞我的和親對象是個殘疾皇子理肺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容