以下問題:volatile Object A;volatile Object B;volatile Object C;Thread1:reads and writes to A-C Thread2:the same as Thread1所以我的問題是:如果我這樣做會(huì)更好嗎: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;只有一個(gè) volatile 變量更好,還是我應(yīng)該讓我可以在 valatile 上寫/讀的每個(gè)變量?這樣可以嗎,如果我每次都在我的第二個(gè)解決方案中寫入我的 memoryBarrier?,以觸發(fā)寫入 - 讀取 - 在 java 中的關(guān)系語義之前發(fā)生?我猜它沒有被優(yōu)化掉?所以總結(jié):我的解決方案 1 和 2 在語義上是否相等?解決方案2更好嗎?我是否可以始終將相同的值寫入 volatile 變量以獲得讀/寫 volatile happensbefore-relationship?
1 回答

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