從萌新的角度理解java內存模型

一丶工作內存和主內存

java內存模型,簡稱JMM(Java Memory Model),個人對於JMM理解是:JVM屏蔽了操作系統對於物理內存訪問的複雜性,目的從軟件設計角度呈現出的一種內存訪問的邏輯視圖。也就是JMM是JVM爲軟件工程師提供的一系列內存訪問的邏輯規則,理解併合理使用這些規則就能正確訪問內存,至於底層和物理內存直接交互動作已經被透明化了,無須關心。下圖是JMM內存模型視圖,是內存訪問規則的基礎。
JMM視圖

  • 主內存:
    主內存是線程公有的,是所有線程都能訪問的內存區域,一般對應於java內存佈局中的堆區。

  • 工作內存
    工作內存是線程私有的。一般對應於JVM虛擬機棧,以及本地方法棧

  • 工作內存和主內存之分
    從邏輯上看,如果沒有主內存和工作內存的區分,只有一整塊的內存,似乎也並無不妥。那麼區分主內存和工作內存的意義何在?馮諾依曼的計算機體系結構上圖是耳熟能詳的馮諾依曼體系結構,現代計算機是基於馮諾依曼體系上發展起來的。該體系有兩個關鍵的組成就是存儲器和CPU(運算器和控制器)。其中存儲器則是我們所討論的物理內存。CPU和內存之間的IO操作是存在瓶頸的,內存的操作速度遠遠小於CPU的運算速度。在CPU和內存協同工作的場景中,CPU以較短的時間完成數值計算後,需要花較長的時間等待內存讀取操作,造成了CPU運算資源的浪費。於是,位於CPU和內存之間的高速緩存應運而生。
    CPU,高速緩存,內存之間關係在引入了高速緩存之後,CPU會將運算所需要的數據一次性的加載到高速緩存中,高速緩衝具備比內存更快的存取速度。CPU和高速緩存之間配合大大提高了CPU資源的利用率。此時在看工作內存和主內存關係,從邏輯上,高速緩存對應工作內存,每個線程分配到CPU時間片時,獨自享有高速緩存的使用能力。主內存對應存儲的物理內存。特別注意,這只是邏輯上的對等關係,物理的上具體對應關係十分複雜,這裏不討論。

二丶工作內存和主內存之間的交互規則

工作內存和主內存之間協同工作纔是JMM的核心部分。從上文描述中可以知道,工作內存是主內存部分內容的拷貝,在多線程環境中,可能存在多份主內存的拷貝。CPU是直接操作工作內存,最後將工作內存同步到主內存,這個過程會造成各個工作內存具備不一致性爲了在多線程環境下能實現工作內存中一致性,JMM定義了工作內存和主內存之間的交互操作,總共有8個原子性的交互操作

  • lock
    鎖操作,如果線程對內存中某個變量進行了lock,在同一時間將禁止其他所有線程對主內存中該變量進行讀取操作。線程對應的工作內存和主內存之間禁止交互。

  • unlock
    unlock 操作在lock操作之後執行。這是釋放鎖操作,將放開線程對工作內存中變量的讀取操作。放開線程對應的工作內存和主內存之間的交互。lock操作和unlock操作是成對出現的,執行多少次lock操作,就要執行相應次數的unlock操作才能完全釋放。

  • load
    load操作,是指將主內存中某個變量的值加載到工作內存中,可以看成一次內存轉移操作。

  • read
    read操作和load操作成對出現,邏輯上出現在load操作之後,該操作將轉移到工作內存中的變量值具體複製給某個變量。read可看成是發生在工作內存之中的變量初始化操作,load是工作內存和主內存之間的拷貝工作,兩者配合完成一次變量讀取操作。

  • use
    CPU使用工作內存中變量需要執行use操作,是定義在工作內存中的一種操作

  • assign
    賦值操作,顯而意見,如果發生變量賦值操作,將執行該原子原子操作,是定義在工作內存中的操作。

  • store
    該操作和load操作是對應的操作,完成工作內存中內容向主內存中內容的轉移。

  • write
    writer操作邏輯上發生在store操作之後,完成對主內容變量的回寫。store操作和write操作是load和read操作的對稱操作。

JVM定義的上述八種操作均是原子的,是最小操作單位,不可分割。除此之外,上述八個操作並不是孤立的,而是相互聯繫的,它們之間的操作必須符合下述規則:
(1) 對主內存中某個變量執行lock操作,將會清空工作內存中該變量值。對變量執行unlock操作之前,必須將其同步到主內存中(store,write)。
(2)工作內存中的變量如未經過assgin操作,那麼不允許同步到主內存中。
(3)load和read操作必須順序執行,但不一定需要連續執行。store和write操作也必須順序執行,但不一定需要連續執行。上述兩對操作必須形成閉環,不能只有load操作而沒有read操作。
上述的八個原子操作和相應的交互規則就是JVM對內存的訪問規則,掌握和理解這些規則對開發正確的多線程程序十分重要

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章