1. 程式人生 > >Java 記憶體模型-同步八種操作

Java 記憶體模型-同步八種操作

(1)lock(鎖定):作用於主記憶體的變數,把一個變數標記為一條執行緒獨佔狀態(2)unlock(解鎖):作用於主記憶體的變數,把一個處於鎖定狀態的變數釋放出來,釋放後的變數才可以被其他執行緒鎖定(3)read(讀取):作用於主記憶體的變數,把一個變數值從主記憶體傳輸到執行緒的工作記憶體中,以便隨後的load動作使用(4)load(載入):作用於工作記憶體的變數,它把read操作從主記憶體中得到的變數值放入工作記憶體的變數副本中(5)use(使用):作用於工作記憶體的變數,把工作記憶體中的一個變數值傳遞給執行引擎(6)assign(賦值):作用於工作記憶體的變數,它把一個從執行引擎接收到的值賦給工作記憶體的變數(7)store(儲存):
作用於工作記憶體的變數,把工作記憶體中的一個變數的值傳送到主記憶體中,以便隨後的write的操作(8)write(寫入):作用於工作記憶體的變數,它把store操作從工作記憶體中的一個變數的值傳送到主記憶體的變數中如果要把一個變數從主記憶體中複製到工作記憶體中,就需要按順序地執行read和load操作,如果把變數從工作記憶體中同步到主記憶體中,就需要按順序地執行store和write操作。但Java記憶體模型只要求上述操作必須按順序執行,而沒有保證必須是連續執行。對應如下的流程圖:


同步規則分析:1)不允許一個執行緒無原因地(沒有發生過任何assign操作)把資料從工作記憶體同步會主記憶體中2)
一個新的變數只能在主記憶體中誕生,不允許在工作記憶體中直接使用一個未被初始化(load或者assign)的變數。即就是對一個變數實施use和store操作之前,必須先自行assign和load操作。3)一個變數在同一時刻只允許一條執行緒對其進行lock操作,但lock操作可以被同一執行緒重複執行多次,多次執行lock後,只有執行相同次數的unlock操作,變數才會被解鎖。lock和unlock必須成對出現。4)如果對一個變數執行lock操作,將會清空工作記憶體中此變數的值,在執行引擎使用這個變數之前需要重新執行load或assign操作初始化變數的值。5)如果一個變數事先沒有被lock操作鎖定,則不允許對它執行unlock操作;也不允許去unlock一個被其他執行緒鎖定的變數。6)
對一個變數執行unlock操作之前,必須先把此變數同步到主記憶體中(執行store和write操作)