happens-before的法則

內容來源於《JAVA併發編程實踐》

Java存儲模型的定義是通過動作(actions)的形式進行描述的。所謂動作,包括變量的讀和寫、監視器加鎖和釋放鎖、線程的啓動和拼接(join)。

JAVA存儲模型(JMM)爲所有程序內部的動作定義了一個偏序關係,叫做happens-before。要保證執行動作B的線程看到動作A的結果(無論A與B是否發生在同一個線程中),A和B之間就必須滿足happens-before關係。如果兩個操作之間並未按照happens-before關係排序,JVM可以對他們隨意地重排序。

happens-before法則包括:

程序次序法則:線程中的每個動作A都happens-before於該線程中的每一個動作B,其中,在程序中,所有的動作B都出現在動作A之後。

監視器鎖法則:對一個監視器鎖的解鎖happens-before於每一個後續對同一監視鎖的加鎖。

volatile變量法則:對volatile域的寫入操作happens-before於每一個後續對同一域的讀操作。

線程啓動法則:在一個線程裏,對Thread.start的調用會happens-before於每一個啓動線程中的動作。

線程終結法則:線程中的任何動作都happens-before於其他線程檢測到這個線程已經終結、或者從Thread.join調用中成功返回,或者Thread.isAlive返回false。

中斷法則:一個線程調用另一個線程的interrupt,happens-before於被中斷的線程發現中斷(通過拋出InterrutedException,或者調用isInterrupted和interrupted)

終結法則:一個對象的構造函數的結束happens-before於這個對象finalizer的開始。

傳遞性:如果happens-before於B,且B happens-before於C,則A happens-before於C

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章