1. 程式人生 > >java記憶體模型與執行緒(1)

java記憶體模型與執行緒(1)

一、處理器、快取記憶體、主記憶體之前的互動圖

二、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操作)