一、什麼是JMM?
1.定義:
JMM(Java Memory Model)Java內存模型.
2. JMM 和 JVM 的區別
- JVM內存模型指的是 – 內存分區圖
- JMMJava內存模型 指的是 一種**
==虛擬機規範==
.**
二、JMM有何用?
1. (抽象)定義了主內存和線程之間的關係:
之前在多線程安全問題的產生 的時候也涉及到了點擊跳轉
1.共享變量在主內存中 (Main Memory)
2.每個線程在本地內存(Local Memory)
3.本地內存和主內存是抽象的概念,物理上不存在,只是更多的讀寫和計算都運行在 本地內存中,所以本地內存待遇更好(優先使用高速度的寄存器和高速緩存)
2. 線程 A 和 線程 B如何通信?
必須通過主內存,線程安全問題就是通信失敗的例子.
Java 高級,多線程,線程安全產生的原因;多線程問題的代碼模擬
3. 工作內存和主內存交互的8大操作
名稱 | 作用內存 | 作用 |
---|---|---|
1.Lock(鎖定) | 主內存 | 把一個鎖住(變量標識爲一條線程獨佔狀態。) |
2.Unlock(解鎖): | 主內存 | 把變量解鎖(可繼續被其他線程鎖定了) |
3.Read(讀取) | 主內存 | 讀取變量的值到工作內存,以便後的load操作 |
4.Load:(載入) | 工作內存 | 把read的值放到工作內存的變量副本中。 |
5.use(使用) | 工作內存 | 把工作內存變量副本中的值傳遞給執行引擎進行使用**(比如計算)**, |
6.assign(賦值) | 工作內存 | 執行引擎計算後的值賦 |
給工作內存的變量副本中 | ||
7.store(儲存) | 工作內存 | 工作內存的變量副本的值傳遞給主內存,和載入相反 |
8.write(寫入) | 主內存 | 將store的值寫入到主內存變量中 |
4. 八大操作必須滿足以下規則
規則 | 解釋 |
---|---|
1.順序執行 | 如果把一個變量從主內存複製到工作內存,就需要膽汁順序地執行store和write操作,但是沒有必須保證是連續執行 |
2.配對出現 | 不允許 read 和load,store 和 write 單一出現 lock 和 unlock 單一出現 |
3.沒assign不準回主內存 | 如果一個變量沒有經歷重工作內存中取出的到執行引擎運算,就不讓回去 |
4.變量從主內存中出生 | 一個變量只能在主內存中產生 |
5. | 如果對一個變量執行lock操作,將會清空工作內存中此變量的值,在執行引擎使用這個變量前需要重新執行load或assign操作初始化變量的值 |
6. | 如果一個變量事先沒有被lock操作鎖定,則不允許對它執行unlock操作;也不允許去unlock一個被其他線程鎖定的變量 |
7. | 對一個變量執行unlock操作之前,必須先把此變量同步到主內存中(執行store和write操作)。 |