**:
1. 首先,執行緒a把本地記憶體a中更新過的共享變數重新整理到主記憶體中去。
2. 然後,執行緒b到主記憶體中去讀取執行緒a之前已更新過的共享變數。
1. 共享物件對各個執行緒的可見性
2. 共享物件的競爭現象
指令級並行的重排序:如果不存l在資料依賴性,處理器可以改變語句對應機器指令的執行順序。
記憶體系統的重排序:處理器使用快取和讀寫緩衝區,這使得載入和儲存操作看上去可能是在亂序執行。
影響某些資料(或則是某條指令的執行結果)的記憶體可見性。
在寫入變數a之前的寫入操作,其更新的資料對於其他執行緒也是可見的。因為memory barrier會刷出cache中的所有先前的寫入。
深入理解Java記憶體模型(二) 重排序
如果兩個操作訪問同乙個變數,且這兩個操作中有乙個為寫操作,此時這兩個操作之間就存在資料依賴性。資料依賴分下列三種型別 上面三種情況,只要重排序兩個操作的執行順序,程式的執行結果將會被改變。前面提到過,編譯器和處理器可能會對操作做重排序。編譯器和處理器在重排序時,會遵守資料依賴性,編譯器和處理器不會改...
深入理解java記憶體模型(二)重排序
資料依賴性 如果兩個操作訪問同乙個變數,且這兩個操作中有乙個為寫操作,此時這兩個操作之間就存在資料依賴性。資料依賴分下列三種型別 名稱 示例 說明 寫後讀 a 1 b a 寫乙個變數之後,再讀這個位置。寫後寫 a 1 a 2 寫乙個變數之後,再寫這個變數。讀後寫 a b b 1 讀乙個變數之後,再寫...
深入理解Java記憶體模型二 重排序
如果兩個操作訪問同乙個變數,且這兩個操作中有乙個為寫操作,此時這兩個操作之間就存在資料依賴性。資料依賴分下列三種型別 上面三種情況,只要重排序兩個操作的執行順序,程式的執行結果將會被改變。前面提到過,編譯器和處理器可能會對操作做重排序。編譯器和處理器在重排序時,會遵守資料依賴性,編譯器和處理器不會改...