以下问题: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
提交
取消