以下問題:volatile Object A;volatile Object B;volatile Object C;Thread1:reads and writes to A-C Thread2:the same as Thread1所以我的問題是:如果我這樣做會更好嗎:Object A;Object B;Object C;volatile boolean memoryBarrier=true;Thread1:Before read of A-C: read memoryBarrierAfter some write of A-C: write memoryBarrier=true;Thread2:the same as Thread1:Before read of A-C: read memoryBarrierAfter some write of A-C: write memoryBarrier=true;只有一個 volatile 變量更好,還是我應該讓我可以在 valatile 上寫/讀的每個變量?這樣可以嗎,如果我每次都在我的第二個解決方案中寫入我的 memoryBarrier?,以觸發寫入 - 讀取 - 在 java 中的關系語義之前發生?我猜它沒有被優化掉?所以總結:我的解決方案 1 和 2 在語義上是否相等?解決方案2更好嗎?我是否可以始終將相同的值寫入 volatile 變量以獲得讀/寫 volatile happensbefore-relationship?
1 回答

aluckdog
TA貢獻1847條經驗 獲得超7個贊
該示例非常簡單,因此您可能看不到性能方面的太大差異。
我的直覺告訴我,在進行 3 次非易失性內存訪問后進行一次volatile
訪問可能比volatile
連續發出 3 次訪問要好。
這三個volatile
內存訪問是完全有序的(A happens-before B happens-before C)并限制編譯器和處理器執行某些優化。非易失性版本在 A、B 和 C 之間建立無先行關系,因此為編譯器和處理器提供更多自由來利用內存級并行/指令級并行。
添加回答
舉報
0/150
提交
取消