指令重排(Happens-Before法則)

1.什么是指令重排

程序指令的執(zhí)行順序有可能和代碼的順序不一致,這個過程就稱之為指令重排。

2.指令重排的作用

JVM能根據(jù)處理器的特性,充分利用多級緩存,多核等進(jìn)行適當(dāng)?shù)闹噶钪嘏判颍钩绦蛟诒WC業(yè)務(wù)運行的同時,充分利用CPU的資源,發(fā)揮最大的性能!

由于指令重排的特性,為了保證程序在多線程的條件下運行結(jié)果能夠與單一線程下一致,引入了Happens-Before規(guī)則。也就是說,Happens-Before規(guī)則主要是用來確保并發(fā)情況下數(shù)據(jù)的正確性。

3.Happens-Before的含義

如果動作B要看到動作A的執(zhí)行結(jié)果,無論A/B是否在同一個線程中,那么A/B必須滿足happens-before規(guī)則。

4. happens-before規(guī)則

1)如果ActionA和ActionB屬于同一個線程,那么就說明ActionA happens-before ActionB。
2)如果ActionA是unlock操作,而ActionB是lock操作,那么ActionA happens-before ActionB。
3)如果A是對volatile變量的寫操作,ActionB是對同一個變量的讀操作,那么ActionA happens-before ActionB。
4)線程的啟動Action happens-before 該線程上的其他動作。
5)線程中任何Action都 happens-before 任何其他線程檢測到該線程已經(jīng)結(jié)束、Thread.join調(diào)用成功返回,Thread.isAlive返回false。
6)一個線程調(diào)用另一個線程的interrupt一定發(fā)生在另一個線程中斷之前。
7)一個對象的構(gòu)造函數(shù)結(jié)束一定發(fā)生在兌現(xiàn)finalizer之前。
8)ActionA發(fā)生在ActionB之前,ActionB發(fā)生在ActionC之前,則ActionA一定發(fā)生在ActionC之前。
ActionA happends-before ActionB,記作hb(ActionA,ActionB)。

5. JMMA(Java Memory Model Action)

Java模型動作,一個Action包含,變量讀取、變量寫、監(jiān)視器枷鎖、釋放鎖、線程啟動(start)、線程等待(join)。

6. happens-before應(yīng)用的例子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 接指令重排序?qū)χ鞔娴囊淮卧L問一般花費硬件的數(shù)百次時鐘周期。處理器通過緩存(caching)能夠從數(shù)量級上降低內(nèi)存延...
    值得一看的喵閱讀 624評論 0 0
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 13,796評論 1 92
  • 1. tab列表折疊效果 html: 能源系統(tǒng)事業(yè)部 崗位名稱: 工作地點 崗位名...
    lilyping閱讀 1,899評論 0 1
  • 虛度光陰空染指,錯失緣念亂成吟。 一心孤對刁殘月,兩盞難邀共已人。 混跡俗群迷道路,偷來文酒醉詩心。 簡書方作文詩...
    房謀杜斷閱讀 1,116評論 15 17
  • 01 寫這篇文章,也許會遭到許多人的批判,但是我并不擔(dān)心會受到生命威脅,因為我知道,一篇文章的力量微乎其微,大量的...
    陳祿閱讀 987評論 6 5