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

一丶工做內存和主內存

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

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對內存的訪問規則,掌握和理解這些規則對開發正確的多線程程序十分重要線程

相關文章
相關標籤/搜索