happen before

引用

what?

  • 小明: 這是個什麼東西?
  • 小紅: 這是一個概念,一個對編譯器/cpu執行代碼的約束,當然也可以用來約束其他行爲
  • 小明: 啊?代碼不就是一行行執行嗎?是有什麼特殊的情況嗎?
  • 小紅: no,實際上我們寫的代碼,編譯器/cpu都可能進行重排序,實際上的順序已經不是我們寫代碼的順序了.
  • 小明: 我草,那他喵我寫的代碼結果不就都亂了,把我代碼的順序都打亂.
  • 小紅: 所以啊,這就是對編譯器/cpu排序做的要求,你他喵順便排,但是一定要和我寫代碼的結果一樣就行了.
  • 小明: 原來如此,就是針對重排序要求的一個底線.

總結:

  • 如果編碼中,語句一在語句二之前執行,那麼要求最終結果看起來要像語句一在語句二之後執行,看起來有先後順序.
  • 字面意思: 發生之前
  • 一般主語是 某個事件,介詞後一般也是某個事件.
    • 錯誤理解:例如事件A happen before 事件B,從字面意思上說是 事件A發生在事件B之前.
    • 其實他要求如果事件A happen before 事件B,他只是要求從最終結果來看:事件A的結果在事件B之前就夠了
    • 實際上,事件A/B的發生順序他纔不管.

爲什麼要這麼個原則,看起來不能說毫無作用,只能說屁用沒有?

  • 我們程序員寫代碼時,是要求內存模型易於理解,易於編程,所以我們需要依賴一個強內存模型來編碼。 也就是說向公理一樣,定義好的規則,我們遵守規則寫代碼就完事了。
  • 對於編譯器和處理器的實現來說,它們希望約束儘量少一些,畢竟你限制它們肯定影響它們的執行效率,不能讓他們盡己所能的優化來提供性能。所以他們需要一個弱內存模型。
  • 哦哦,原來是執行器可能會把我們寫的代碼順序優化得亂七八糟,那麼我們要對他做一個要求,那就是從結果看,像是我們代碼寫的順序執行的結果

實例

  • 有這麼一段簡單的代碼
int i = 1;  //語句一
i = i + 5;  //語句二
int j = 2;  //語句三
j = j +4;   //語句四
  • 就是這麼一段簡單的代碼,java在同一線程中,順序需要和語言讀起來一樣.實際上呢,只要結果一樣,其他都不管你,所以順序是下圖這樣完全沒有問題
int i = 1;
int j = 2;
i = i + 5;
j = j + 4;
  • 我們分析下,實際上語句三先於語句二,有關係嗎?
  • 沒關係.最後結果沒有問題就ok
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章