標籤:程式 參考資料 nss -- 方法 targe 成功 final vol
happens-before原則:
- happens-before它是判斷資料是否存在競爭、線程是否安全的主要依據。為了保證安全執行緒我們可以讓2個操作具有happens-before關係
- 如果一個操作happens-before與另一個操作,那麼第一個操作的結果將對第二個操作可見,而且第一個操作的執行順序在第二個操作之前,但這順序僅僅是對於程式員來說是這樣,實際執行並不一定。
- 如果2個操作重排序之後 執行的結果與happens-before規則執行的結果一樣則允許重排序。
happens-before的8條規則能夠保證存在happens-before規則的單一線程或者多條線程之中的2個操作是安全的。
- 程式順序規則:一個線程內,按照代碼順序,書寫在前面的操作先行發生於書寫在後面的操作。
- 監視器鎖規則:對一個鎖的解鎖,happens-before於隨後對這個鎖的加鎖。
- volatile變數規則:對一個volatile域的寫,happens-before於任意後續對這個volatile域的讀。
- 傳遞性:如果A happens-before B,且B happens-before C,那麼A happens-before C。
- start()規則:如果線程A執行操作ThreadB.start()(啟動線程B),那麼A線程的ThreadB.start()操作happens-before於線程B中的任意操作。
- join()規則:如果線程A執行操作ThreadB.join()並成功返回,那麼線程B中的任意操作happens-before於線程A從ThreadB.join()操作成功返回
- 線程終結規則:線程中所有的操作都先行發生於線程的終止檢測,我們可以通過Thread.join()方法結束、Thread.isAlive()的傳回值手段檢測到線程已經終止執行;
- 對象終結規則:一個對象的初始化完成先行發生於他的finalize()方法的開始;
參考資料
- 《Java並發編程的藝術》
- 【死磕Java並發】-----Java記憶體模型之happens-before
happens-before規則