操作時間的先後順序和先行發生(happens-before)之間沒有必

choubou發表於2021-09-09

**happens-before原則的作用:判斷兩個操作之間是否存在衝突。如果符合happens-before規則,是不存在衝突。不符合happens-before規則,就需要自己處理執行緒安全的問題。

操作時間的先後順序和先行發生(happens-before)之間沒有必然關係?

也就是先行發生(happens - before)原則,不是說執行的時間順序。這句話怎麼理解。
例如:一個執行緒執行 i = 1 ; j =2;

按照happens-before原則中的程式次序原則(一般是程式碼在前先執行原則),i =1 操作先行於 j = 2;

但cpu完全有可能先執行i的初始化為0,然後cpu執行完 j = 2 再執行,i = 1,這樣的結果也是正確的。所以說時間上先執行的, 並沒有先行發生。

happens-before原則的: 以下幾條操作是不需要考慮執行緒安全問題的,

程式次序規則(program order rule): 在一個執行緒內,先在前面的程式碼操作先行。準確的說控制流順序而不是程式碼順序。需要考慮分支,迴圈等結構。

管程鎖定規則(monitor lock rule):同一個資源鎖,先unlock,之後才能lock。

Volatile變數規則(volatile variable rule):一個變數被volatile修飾,多執行緒操作,先執行操作,再執行讀操作。(同時寫操作只能有一個)

執行緒啟動規則(Thread start rule):Thread物件的start方法,先行發生於此執行緒的每一個方法。

執行緒終止規則(Thread Termination rule):該執行緒的所有方法,先行發生於該執行緒的終止檢測方法。例如:可以透過Thread.join方法結束,Thread.isAlive()的返回值等手段檢測到執行緒已經終止執行。

執行緒中斷規則(Thread Interruption Rule): 中斷方法先行發生於,中斷檢測方法。中斷方法interrupt(),中斷檢測interrupted()方法。

物件終結規則(finalizer rule): 一個物件的初始化完成(建構函式執行結束)先行發生於它的finalizer方法的開始。

傳遞性(Transitivity): 如果操作A先行發生於操作B,操作B先行發生於操作C,那就可以得出操作A先行發生於操作C的結論。

原文連結:https://mp.weixin.qq.com/s/jEvpE2NHFBR56-NtFwQu_A
作者:一起寫程式

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4548/viewspace-2807323/,如需轉載,請註明出處,否則將追究法律責任。

相關文章