java內存模型,簡稱JMM(Java Memory Model),我的對於JMM理解是:JVM屏蔽了操做系統對於物理內存訪問的複雜性,目的從軟件設計角度呈現出的一種內存訪問的邏輯視圖。也就是JMM是JVM爲軟件工程師提供的一系列內存訪問的邏輯規則,理解併合理使用這些規則就能正確訪問內存,至於底層和物理內存直接交互動做已經被透明化了,無須關心。下圖是JMM內存模型視圖,是內存訪問規則的基礎。 java
從邏輯上看,若是沒有主內存和工做內存的區分,只有一整塊的內存,彷佛也並沒有不妥。那麼區分主內存和工做內存的意義何在? 緩存
上圖是耳熟能詳的馮諾依曼體系結構,現代計算機是基於馮諾依曼體系上發展起來的。該體系有兩個關鍵的組成就是 存儲器和CPU(運算器和控制器) 。 其中存儲器則是咱們所討論的物理內存。 CPU和內存之間的IO操做是存在瓶頸的,內存的操做速度遠遠小於CPU的運算速度。在CPU和內存協同工做的場景中,CPU以較短的時間完成數值計算後,須要花較長的時間等待內存讀取操做,形成了CPU運算資源的浪費。 因而,位於CPU和內存之間的高速緩存應運而生。 在引入了高速緩存以後,CPU會將運算所須要的數據一次性的加載到高速緩存中,高速緩衝具有比內存更快的存取速度。CPU和高速緩存之間配合大大提升了CPU資源的利用率。 此時在看工做內存和主內存關係,從邏輯上,高速緩存對應工做內存,每一個線程分配到CPU時間片時,獨自享有高速緩存的使用能力。主內存對應存儲的物理內存。特別注意,這只是邏輯上的對等關係,物理的上具體對應關係十分複雜,這裏不討論。工做內存和主內存之間協同工做纔是JMM的核心部分。從上文描述中能夠知道,工做內存是主內存部份內容的拷貝,在多線程環境中,可能存在多份主內存的拷貝。CPU是直接操做工做內存,最後將工做內存同步到主內存,這個過程會形成各個工做內存具有不一致性。爲了在多線程環境下能實現工做內存中一致性,JMM定義了工做內存和主內存之間的交互操做,總共有8個原子性的交互操做多線程
(1) 對主內存中某個變量執行lock操做,將會清空工做內存中該變量值。對變量執行unlock操做以前,必須將其同步到主內存中(store,write)。佈局
(2)工做內存中的變量如未通過assgin操做,那麼不容許同步到主內存中。操作系統
(3)load和read操做必須順序執行,但不必定須要連續執行。store和write操做也必須順序執行,但不必定須要連續執行。上述兩對操做必須造成閉環,不能只有load操做而沒有read操做。 上述的八個原子操做和相應的交互規則就是JVM對內存的訪問規則,掌握和理解這些規則對開發正確的多線程程序十分重要線程