內容來源於《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