以下问题:
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 memoryBarrier
After some write of A-C: write memoryBarrier=true;
Thread2:
the same as Thread1:
Before read of A-C: read memoryBarrier
After some write of A-C: write memoryBarrier=true;
只有一个 volatile 变量更好,还是应该让每个变量都可以在 valatile 上写入/读取?
如果我在第二个解决方案中每次都写入内存屏障,可以触发写-读发生在java中的关系语义之前吗?我猜它没有优化?
总结一下: 我的解决方案 1 和 2 在语义上相等吗? 解决方案2更好吗? 我是否可以始终将相同的值写入 volatile 变量以获得读/写 volatile 发生在关系之前?
最佳答案
该示例非常简单,因此您可能看不到性能方面的太大差异。
我的直觉告诉我,有 3 个非 volatile 内存访问,然后是一个 volatile
访问可能比发出 3 volatile
更好连续访问。
那三个volatile
内存访问是完全有序的(A 发生在 B 发生在 C 之前),并限制编译器和处理器执行某些优化。非 volatile 版本在 A、B 和 C 之间建立了没有发生之前的关系,因此为编译器和处理器提供了更多自由来利用内存级并行性/指令级并行性。
关于java:在一个变量上使用 volatile VS 每个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57420559/