一、定義:
指兩個操作之間的執行順序,這兩個操作可以在同一線程內,也可以在不同的線程之間。因此,JMM可以通過happens-before關系 來向程序員提供跨線程的內存可見性保證。
JMM線程規范中對happens-before的關系定義如下:
1)、如果一個操作happens-before另一個操作,那么第一個操作的執行結果將對第二個操作可見。而且第一個操作的執行順序排在第二個之前;
2)、兩個操作之間存在happens-before關系,并不意味著Java平臺必須按照happens-before關系指定的順序來執行,如果重排序后的執行結果和與按照happens-before關系指定的執行順序一致,那么這種重排序未非法。
二、happens-before的規則
JMM定義了以下的happends-before 規則:
1)、程序順序規則:一個線程中的每一個操作,happens-before于該 線程中的任意后續操作;
2)、監視器鎖規則:對一個鎖的解鎖,happens-before于隨后對這個鎖的加鎖;
3)、volatile變量規則:對一個volatile域的寫,happens-before于任何后續對于這個volatile域的讀;
4)、傳遞性:如果A happens-before B,且B happens-before C,那么A happens-before于C;
5)、start()規則:如果線程A執行操作ThreadB.start(),啟動線程B,那個A線程的Thread.start() happens-before于線程B中的任何操作;
6)、join()規則:如果線程A執行ThreadB.join()并成功返回,那么線程B中的做任何操作happens-before于線程A從ThreadB.join9()成功返回;