老漢談——Java內存模型-同步操作與規則

Java內存模型-同步操作與規則

內存間交互操作,其實就是關於主內存和工作內存之間具體的交互協議,即一個變量如果從主內存拷貝到工作內存,如果從工作內存同步回豬內存之內的實現細節。Java內存模型定義以下8中操作來完成。

Lock

主內存變量標記成一個線程獨佔的狀態

#Unlock

將主內存一個鎖定的狀態變量給釋放出來,釋放後的變量可以被其他線程鎖定

Read

將主內存的變量,它把一個變量的值從主內存傳輸到線程的工作內存中,便於後面的load使用。

Load

將把Read操作從主內存中得到的變量值放入到工作內存的變量副本里。

Use

把工作內存中一個變量的值傳遞給執行引擎,每當虛擬機遇到一個需要使用到變量的值的字節碼指令時將會執行這個操作。

Assign

把一個從執行引擎接受到的值給工作內存變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操作。

Store

把工作內存的一個變量值傳送到主內存中,以便隨後的write操作使用。

Write

把store操作從工作內存中得到的變量的值放入到主內存中的變量中。


從以上8中操作可以看出,如果需要變量將主內存複製到工作內存,那麼就要順序執行read load操作,如果把變量從工作內存同步回主內存,則需要順序執行store write操作。但是,雖然是順序執行,但不代表是連續執行。也就是說,read----->load, store------>write之間的操作,可以插入其他指令的,如對主內存中的變量a、b進行訪問時,一種可能出現的順序是read a ---->read b—> load b—>load a .

Java內存模型規定了在執行這8種基本操作時必須滿足如下規則:

  1. 不允許read和load、store和write單獨出現。即不允許一個變量從主內存讀取了但工作內存不接受,或者從工作內從發起會寫了但主內存不接受的情況出現。
  2. 不允許一個線程丟棄它的最近的assign操作,即變量在工作內存中改變了之後必須把該變化同步到主內存裏。
  3. 不允許一個線程無原因地把數據從線程工作內存同步回主內存中,即沒有發生過任何的assign操作就同步到主內存中。
  4. 一個新的變量只能在主內存中誕生,不允許在工作內存中直接使用一個沒有被初始化(load或assign)的變量,換句話說,就是對一個變量實施use、store操作之前,必須先執行assign和load操作。
  5. 一個變量在同一時刻,只允許一個線程對其進行loack操作,但lock操作可以被同一個線程重複執行多次,多次執行lock後,只有執行相同次數的unloack操作,變量才能被解鎖。
  6. 如果對一個變量執行了lock操作,那將會清空工作內存中此變量的值,在執行引擎使用這個變量前,需要重新執行load或assign操作初始化變量的值。
  7. 如果一個變量事先沒有被lock操作鎖定,那就不允許對他執行unlock操作,也不允許去unlock一個被其他線程鎖定住的變量
  8. 對一個變量執行unlock操作之前,必須先把此變量同步回主內存中(執行store、write操作)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章