Java內存模型-指令重排序&順序一致性

章節目錄

  • 1.重排序定義
  • 2.數據依賴性
  • 3.as-if-serial語義
  • 4.程序順序規則
  • 5.JMM 參考 順序一致性內存模型的實踐規范

1.重排序定義

重排序是指編譯器和處理器為優化程序性能而對指令序列重新排序的一種手段。

2.數據依賴性

如果兩個操作訪問同一個變量,且兩個操作中有一個為寫操作,此時這兩個操作之間就存在數據依賴性。

如下表所示,是我們常見的數據依賴性場景:

操作模式 代碼示例 說明
store->load a=1;
b=a;
寫一個變量后,再讀這個位置
store->store a=1;
a=2
寫一個變量之后,再寫這個變量
load->store a=b;
b=1
讀一個變量之后,再寫這個變量

注意:
上述指令重排序之后,執行結果就會發生變化,所以編譯器和處理器不會改變存在數據依賴關系的兩個操作的執行順序。僅針對于單個處理器中執行的指令序列和單個線程中執行的操作。

3.as-if-serial 語義

對于不存在數據依賴性的操作可以做指令重排序。as-if-serial語義把單線程程序保護了起來。

4.程序順序規則

如果A happens-before B,注意happens-before定義的不是A,B操作執行的順序是A先B后,,而是A操作的結果對B操作的結果可見,且A操作的結果按順序排在B操作結果之前,所以進行指令重排序必須保證的前提是不改變程序執行結果。

5.JMM 參考 順序一致性內存模型的實踐規范

  • 1.JMM采用共享內存模型通過通過控制共享內存與每個線程本地內存之間的交互,來提供內存可見性保證。
  • 2.JMM通過指令重排序來優化程序執行性能,但不正確的重排序會破壞多線程程序的語義,程序運行結果出現非預想的情況。
  • 3.JMM參考順序一致性內存模型,(但不能完全實現,比如在非同步多線程程序下),來對正確同步的多線程程序做了如下保證-程序的執行結果與該程序在順序一致性內存模型中的執行結果相同,但正確同步的多線程程序在執行過程中可以對臨界區內不存在數據依賴的指令行進行重排序,以在保證執行結果正確的情況下通過指令重排序對程序運行性能做提升。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Java的并發采用的是共享內存模型(而非消息傳遞模型),線程之間共享程序的公共狀態,線程之間通過寫-讀內存中的公共...
    阿斯蒂芬2閱讀 497評論 0 1
  • 目錄: 1. 指令重排 2. 順序一致性 3. volatile 4. final 1.指令重排 要了解指令重排,...
    西部小籠包閱讀 776評論 0 1
  • 回首這一年,日子過得很累,我大概是一個適合蝸居的人,總喜歡久居一個地方,哪兒都不去。 由于工作的原因,今年的夏天,...
    文字里的拾荒者閱讀 281評論 4 2
  • 回首曾經,遇到很多人很多事,能真正記起來的,也無非是那幾個人,那幾件事。好多的人與事,隨著生活的瑣碎,漸漸的...
    月520半閱讀 219評論 0 1
  • 一個人在深夜讀詩 想起你的名字 飛過的鳥兒翅膀沉了一下 內心的月光更加冰涼 沉重虛張聲勢,沉不過黎明 盤根錯節的塵...
    楊昊田閱讀 2,146評論 36 62