Java內(nèi)存模型

1 Java內(nèi)存模型(JMM)

  • Java線程間的通信由Java內(nèi)存模型(JMM)控制,JMM決定一個線程對共享變量的寫入何時對另一個線程可見
  • JMM是一個抽象的概念,并非真實存在,它涵蓋了緩存、寫緩沖區(qū)、寄存器以及其他的硬件和編譯器的優(yōu)化
  • JMM定義了線程和主內(nèi)存之間的抽象關系:
  • 線程之間的共享變量存儲在主內(nèi)存中(從硬件角度來說就是內(nèi)存條)
  • 每個線程都有一個私有的本地內(nèi)存,本地內(nèi)存中存儲了該線程用來讀/寫共享變量的副本(從硬件角度來說就是CPU的緩存,比如寄存器、L1、L2、L3緩存等)
  • 同時JVM通過JMM來屏蔽各個硬件平臺和操作系統(tǒng)的內(nèi)存訪問差異,以實現(xiàn)讓Java程序在各種平臺下都能達到一致的內(nèi)存訪問效果
  • 重要聲明: JMM所描述的主內(nèi)存、工作內(nèi)存與Java內(nèi)存區(qū)域的堆棧不是一回事,更準確是主內(nèi)存就是內(nèi)存條,為了提高性能,JVM可能會讓工作內(nèi)存優(yōu)先存儲在寄存器和高速緩存中,程序運行時主要訪問讀寫的也是工作內(nèi)存

2 JMM的核心原則

  • JMM的關鍵技術點都是圍繞多線程的原子性、可見性和有序性展開的
  • 多線程并發(fā)的法寶:外互斥、內(nèi)可見

2.1 原子性

  • 原子性是指一個操作是不可中斷的,即多線程環(huán)境下,操作不能被其他線程干擾

2.2 可見性

  • 可見性是指當一個線程修改了某一個共享變量的值,其他線程是否能夠立即知道該變更
  • Java中普通的共享變量不保證可見性,因為其的修改被寫入內(nèi)存的時機是不確定的,多線程并發(fā)下很可能出現(xiàn)"臟讀"
  • 緩存優(yōu)化或者硬件優(yōu)化或指令重排以及編輯器的優(yōu)化都可能導致一個線程修改不會立即被其他線程察覺
  • Java提供volatile保證可見性:寫操作立即刷新到主內(nèi)存,讀操作直接從主內(nèi)存讀取
  • Java同時還可以通過加鎖的同步性間接保證可見性:synchronized和Lock能保證同一時刻只有一個線程獲取鎖并執(zhí)行同步代碼,并在釋放鎖之后將變量的修改刷新到主內(nèi)存中

2.3 有序性

  • 對于一個線程的執(zhí)行代碼而言,我們總是習慣性認為代碼的執(zhí)行總是從上到下,有序執(zhí)行
  • 但為了提供性能,編譯器和處理器通常會對指令序列進行重新排序
  • 指令重排可以保證串行語義一致,但沒有義務保證多線程間的語義也一致,即可能產(chǎn)生"臟讀"

3 JMM的抽象結構

JMM.jpg

4 JMM的影響范圍

  • 在Java中,所有實例域、靜態(tài)域和數(shù)組元素都存儲在堆內(nèi)存中,堆內(nèi)存在線程間共享
  • 局部變量、方法定義參數(shù)和異常處理器參數(shù)不在線程間共享,即不會有可見性問題也不受JMM影響

5 JMM的內(nèi)存可見性保證

  • 單線程程序: 不會出現(xiàn)內(nèi)存可見性問題,不管重排序與否結果也會最終一致
  • 正確同步的多線程程序: 將順序一致性,JMM通過限制重排序來為程序提供內(nèi)存可見性保證
  • 未同步/未正確同步的多線程程序: JMM提供最小安全性保障-線程執(zhí)行時讀取到的值,要么是之前某個線程寫入的值,要么是默認值
1.png

6 JMM的隱患

6.1 寫緩沖區(qū)(工作內(nèi)存)

  • 處理器使用寫緩沖區(qū)臨時保存向內(nèi)存寫入的數(shù)據(jù)
  • 寫緩沖區(qū)可以保證指令流水線持續(xù)運行,避免由于處理器停頓等待向內(nèi)存寫入數(shù)據(jù)產(chǎn)生的延遲
  • 寫緩沖區(qū)還可以通過批處理的方式刷新寫緩沖區(qū),以及合并寫緩沖區(qū)中對同一內(nèi)存地址的多次寫,減少對內(nèi)存總線的占用

6.2 寫緩沖區(qū)的隱患

  • 雖然寫緩沖區(qū)好處多多,但問題在于寫緩沖區(qū)僅對其所在的處理器所見,即是處理器私有工作內(nèi)存
  • 為了獲得較好的執(zhí)行性能,Java內(nèi)存模型并沒有限制執(zhí)行引擎使用處理器的寄存器或者高速緩存來提升指令執(zhí)行速度,也沒有限制編譯器對指令進行重排序
  • 因此,在JMM會存在緩存一致性問題指令重排序的問題

參考

并發(fā)番@Java內(nèi)存模型&Volatile一文通(1.7版)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

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