java記憶體模型與執行緒(1)
阿新 • • 發佈:2018-12-14
一、處理器、快取記憶體、主記憶體之前的互動圖
二、Java記憶體模型
倆張圖之間的關係很清晰
一個處理器對應一個執行緒
一個快取記憶體對應一個工作記憶體
問題的關鍵點就在於:java執行緒之間與工作記憶體打交道,而不是主記憶體,工作記憶體之間沒有直接的關聯,都是要與主記憶體互動,併發關鍵點就在此。
三、記憶體間8種互動操作
1. 8種互動操作的含義
lock:作用於主記憶體的變數,把一個變數標識為一條執行緒獨佔的狀態
unlock:作用於主記憶體的變數,把一個處於鎖定的變數釋放出來
read:作用於主記憶體的變數,把一個變數的值從主記憶體傳輸到工作記憶體
load:把read操作從主記憶體中得到的變數值放入工作記憶體的變數副本中
use:作用於工作記憶體中的變數,把工作記憶體中變數的值傳遞給執行引擎
assign:作用於工作記憶體中的變數,從執行引擎收到的值給工作記憶體中的變數
store:作用於工作記憶體的變數,把工作記憶體中的變數傳送到主記憶體
write:作用於主記憶體的變數,把store操作從工作記憶體中得到的變數的值放入主記憶體的變數中
2. 8種基本操作滿足的規則
1)read 和 load 成對出現, store 和 write 成對出現
2)不允許丟棄assign,即工作記憶體中改變後必須變化同步回主記憶體
3)沒有任何assign操作,不允許把資料從執行緒的工作記憶體同步到主記憶體
4)新的變數誕生只能從主記憶體中誕生,不能在工作記憶體中誕生,因為工作記憶體中只是副本
5)只允許一個執行緒對其進行lock操作,同一個執行緒可以多次lock,但是需要多次unlock解鎖
6)對一個變數lock操作,會清空工作記憶體中的此變數的值,使用時需要重新load或assign操作初始化變數的值
7)unlock操作一定在lock操作之後
8)對變數unlock操作之前,必須先把變數同步回主記憶體中(執行store、write操作)