從萌新的角度理解java內(nèi)存模型

一丶工作內(nèi)存和主內(nèi)存

java內(nèi)存模型,簡稱JMM(Java Memory Model),個人對于JMM理解是:JVM屏蔽了操作系統(tǒng)對于物理內(nèi)存訪問的復(fù)雜性怕膛,目的從軟件設(shè)計角度呈現(xiàn)出的一種內(nèi)存訪問的邏輯視圖。也就是JMM是JVM為軟件工程師提供的一系列內(nèi)存訪問的邏輯規(guī)則,理解并合理使用這些規(guī)則就能正確訪問內(nèi)存素挽,至于底層和物理內(nèi)存直接交互動作已經(jīng)被透明化了,無須關(guān)心狸驳。下圖是JMM內(nèi)存模型視圖预明,是內(nèi)存訪問規(guī)則的基礎(chǔ)。

JMM視圖

  • 主內(nèi)存:
    主內(nèi)存是線程公有的耙箍,是所有線程都能訪問的內(nèi)存區(qū)域撰糠,一般對應(yīng)于java內(nèi)存布局中的堆區(qū)。
  • 工作內(nèi)存
    工作內(nèi)存是線程私有的辩昆。一般對應(yīng)于JVM虛擬機棧阅酪,以及本地方法棧
  • 工作內(nèi)存和主內(nèi)存之分
    從邏輯上看,如果沒有主內(nèi)存和工作內(nèi)存的區(qū)分,只有一整塊的內(nèi)存术辐,似乎也并無不妥砚尽。那么區(qū)分主內(nèi)存和工作內(nèi)存的意義何在?
    馮諾依曼的計算機體系結(jié)構(gòu)
    上圖是耳熟能詳?shù)鸟T諾依曼體系結(jié)構(gòu)辉词,現(xiàn)代計算機是基于馮諾依曼體系上發(fā)展起來的必孤。該體系有兩個關(guān)鍵的組成就是存儲器和CPU(運算器和控制器)。其中存儲器則是我們所討論的物理內(nèi)存较屿。CPU和內(nèi)存之間的IO操作是存在瓶頸的隧魄,內(nèi)存的操作速度遠遠小于CPU的運算速度。在CPU和內(nèi)存協(xié)同工作的場景中隘蝎,CPU以較短的時間完成數(shù)值計算后购啄,需要花較長的時間等待內(nèi)存讀取操作,造成了CPU運算資源的浪費嘱么。于是狮含,位于CPU和內(nèi)存之間的高速緩存應(yīng)運而生。
    CPU曼振,高速緩存几迄,內(nèi)存之間關(guān)系
    在引入了高速緩存之后,CPU會將運算所需要的數(shù)據(jù)一次性的加載到高速緩存中冰评,高速緩沖具備比內(nèi)存更快的存取速度映胁。CPU和高速緩存之間配合大大提高了CPU資源的利用率。此時在看工作內(nèi)存和主內(nèi)存關(guān)系甲雅,從邏輯上解孙,高速緩存對應(yīng)工作內(nèi)存,每個線程分配到CPU時間片時抛人,獨自享有高速緩存的使用能力弛姜。主內(nèi)存對應(yīng)存儲的物理內(nèi)存。特別注意妖枚,這只是邏輯上的對等關(guān)系廷臼,物理的上具體對應(yīng)關(guān)系十分復(fù)雜,這里不討論绝页。

二丶工作內(nèi)存和主內(nèi)存之間的交互規(guī)則

工作內(nèi)存和主內(nèi)存之間協(xié)同工作才是JMM的核心部分荠商。從上文描述中可以知道,工作內(nèi)存是主內(nèi)存部分內(nèi)容的拷貝抒寂,在多線程環(huán)境中结啼,可能存在多份主內(nèi)存的拷貝。CPU是直接操作工作內(nèi)存屈芜,最后將工作內(nèi)存同步到主內(nèi)存郊愧,這個過程會造成各個工作內(nèi)存具備不一致性朴译。為了在多線程環(huán)境下能實現(xiàn)工作內(nèi)存中一致性,JMM定義了工作內(nèi)存和主內(nèi)存之間的交互操作属铁,總共有8個原子性的交互操作

  • lock
    鎖操作眠寿,如果線程對內(nèi)存中某個變量進行了lock,在同一時間將禁止其他所有線程對主內(nèi)存中該變量進行讀取操作焦蘑。線程對應(yīng)的工作內(nèi)存和主內(nèi)存之間禁止交互盯拱。
  • unlock
    unlock 操作在lock操作之后執(zhí)行。這是釋放鎖操作例嘱,將放開線程對工作內(nèi)存中變量的讀取操作狡逢。放開線程對應(yīng)的工作內(nèi)存和主內(nèi)存之間的交互。lock操作和unlock操作是成對出現(xiàn)的拼卵,執(zhí)行多少次lock操作奢浑,就要執(zhí)行相應(yīng)次數(shù)的unlock操作才能完全釋放。
  • load
    load操作腋腮,是指將主內(nèi)存中某個變量的值加載到工作內(nèi)存中雀彼,可以看成一次內(nèi)存轉(zhuǎn)移操作。
  • read
    read操作和load操作成對出現(xiàn)即寡,邏輯上出現(xiàn)在load操作之后徊哑,該操作將轉(zhuǎn)移到工作內(nèi)存中的變量值具體復(fù)制給某個變量。read可看成是發(fā)生在工作內(nèi)存之中的變量初始化操作聪富,load是工作內(nèi)存和主內(nèi)存之間的拷貝工作莺丑,兩者配合完成一次變量讀取操作。
  • use
    CPU使用工作內(nèi)存中變量需要執(zhí)行use操作墩蔓,是定義在工作內(nèi)存中的一種操作
  • assign
    賦值操作窒盐,顯而意見,如果發(fā)生變量賦值操作钢拧,將執(zhí)行該原子原子操作,是定義在工作內(nèi)存中的操作炕横。
  • store
    該操作和load操作是對應(yīng)的操作源内,完成工作內(nèi)存中內(nèi)容向主內(nèi)存中內(nèi)容的轉(zhuǎn)移。
  • write
    writer操作邏輯上發(fā)生在store操作之后份殿,完成對主內(nèi)容變量的回寫膜钓。store操作和write操作是load和read操作的對稱操作。
    JVM定義的上述八種操作均是原子的卿嘲,是最小操作單位颂斜,不可分割。除此之外拾枣,上述八個操作并不是孤立的沃疮,而是相互聯(lián)系的盒让,它們之間的操作必須符合下述規(guī)則:
    (1) 對主內(nèi)存中某個變量執(zhí)行l(wèi)ock操作,將會清空工作內(nèi)存中該變量值司蔬。對變量執(zhí)行unlock操作之前邑茄,必須將其同步到主內(nèi)存中(store,write)。
    (2)工作內(nèi)存中的變量如未經(jīng)過assgin操作俊啼,那么不允許同步到主內(nèi)存中肺缕。
    (3)load和read操作必須順序執(zhí)行,但不一定需要連續(xù)執(zhí)行授帕。store和write操作也必須順序執(zhí)行同木,但不一定需要連續(xù)執(zhí)行。上述兩對操作必須形成閉環(huán)跛十,不能只有l(wèi)oad操作而沒有read操作彤路。
    上述的八個原子操作和相應(yīng)的交互規(guī)則就是JVM對內(nèi)存的訪問規(guī)則,掌握和理解這些規(guī)則對開發(fā)正確的多線程程序十分重要
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偶器,一起剝皮案震驚了整個濱河市斩萌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屏轰,老刑警劉巖颊郎,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霎苗,居然都是意外死亡姆吭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門唁盏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來内狸,“玉大人,你說我怎么就攤上這事厘擂±サ” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵刽严,是天一觀的道長昂灵。 經(jīng)常有香客問我,道長舞萄,這世上最難降的妖魔是什么眨补? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮倒脓,結(jié)果婚禮上撑螺,老公的妹妹穿的比我還像新娘。我一直安慰自己崎弃,他們只是感情好甘晤,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布含潘。 她就那樣靜靜地躺著,像睡著了一般安皱。 火紅的嫁衣襯著肌膚如雪调鬓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天酌伊,我揣著相機與錄音腾窝,去河邊找鬼。 笑死居砖,一個胖子當(dāng)著我的面吹牛虹脯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奏候,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼循集,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蔗草?” 一聲冷哼從身側(cè)響起咒彤,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咒精,沒想到半個月后镶柱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡模叙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年歇拆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片范咨。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡故觅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渠啊,到底是詐尸還是另有隱情输吏,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布替蛉,位于F島的核電站评也,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏灭返。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一坤邪、第九天 我趴在偏房一處隱蔽的房頂上張望熙含。 院中可真熱鬧,春花似錦艇纺、人聲如沸怎静。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚓聘。三九已至腌乡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夜牡,已是汗流浹背与纽。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留塘装,地道東北人急迂。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像蹦肴,于是被迫代替她去往敵國和親僚碎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

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