java內存模型 JMM
920
2022-05-30
Java內存模型之happenbefore原則
JMM其實是在遵循一個基本原則:只要不改變程序的執行結果(指的是單線程程序和正確同步的多線程程序),編譯器和處理器怎么優化都行。
happens-before關系的定義
happens-before關系的定義如下。
1)如果一個操作happens-before另一個操作,那么第一個操作的執行結果將對第二個操作
可見,而且第一個操作的執行順序排在第二個操作之前。
2)兩個操作之間存在happens-before關系,并不意味著Java平臺的具體實現必須要按照
happens-before關系指定的順序來執行。如果重排序之后的執行結果,與按happens-before關系
來執行的結果一致,那么這種重排序并不非法(也就是說,JMM允許這種重排序)。
上面的1)是JMM對程序員的承諾。從程序員的角度來說,可以這樣理解happens-before關
系:如果A happens-before B,那么Java內存模型將向程序員保證——A操作的結果將對B可見,
且A的執行順序排在B之前。注意,這只是Java內存模型向程序員做出的保證!
上面的2)是JMM對編譯器和處理器重排序的約束原則。正如前面所言,JMM其實是在遵
循一個基本原則:只要不改變程序的執行結果(指的是單線程程序和正確同步的多線程程序),編譯器和處理器怎么優化都行。JMM這么做的原因是:程序員對于這兩個操作是否真的被重
排序并不關心,程序員關心的是程序執行時的語義不能被改變(即執行結果不能被改變)。因
此,happens-before關系本質上和as-if-serial語義是一回事。
as-if-serial語義保證單線程內程序的執行結果不被改變,happens-before關系保證正確同
步的多線程程序的執行結果不被改變。
·as-if-serial語義給編寫單線程程序的程序員創造了一個幻境:單線程程序是按程序的順
序來執行的。happens-before關系給編寫正確同步的多線程程序的程序員創造了一個幻境:正
確同步的多線程程序是按happens-before指定的順序來執行的。
as-if-serial語義和happens-before這么做的目的,都是為了在不改變程序執行結果的前提
下,盡可能地提高程序執行的并行度。
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執行操作ThreadB.start()(啟動線程B),那么A線程的
ThreadB.start()操作happens-before于線程B中的任意操作。
線程A在執行ThreadB.start()之前對共享變量所做的修改,接下來在線程B開始執行后都將確保對線程B可見。
6)join()規則:如果線程A執行操作ThreadB.join()并成功返回,那么線程B中的任意操作
happens-before于線程A從ThreadB.join()操作成功返回。
線程A執行操作ThreadB.join()并成功返回后,線程B中的任意操作都將對線程A可見。
Java 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。