happens-before是JMM(java main memory)最核心的概念,在JMM中,如果一個操作執行的結果需要對另一個操作可見,那麼這兩個操作之間必須要存在happens-before關系。這裡提到的兩個操作可以是一個線程内的,也可以是在不同線程之間。
happens-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執行操作TreadB.start()(啟動B線程),那麼A線程的ThreadB.start()操作happens-before于線程B中的任意操作。
6)join()規則:如果線程A執行操作ThreadB.join()并成功傳回,那麼線程B中的任意操作happens-before于線程A從ThreadB.join()操作成功傳回。