猿问

java:在一个变量上使用 volatile VS 每个变量

以下问题:


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 上写/读的每个变量?


这样可以吗,如果我每次都在我的第二个解决方案中写入我的 memoryBarrier?,以触发写入 - 读取 - 在 java 中的关系语义之前发生?我猜它没有被优化掉?


所以总结:我的解决方案 1 和 2 在语义上是否相等?解决方案2更好吗?我是否可以始终将相同的值写入 volatile 变量以获得读/写 volatile happensbefore-relationship?


拉丁的传说
浏览 108回答 1
1回答

aluckdog

该示例非常简单,因此您可能看不到性能方面的太大差异。我的直觉告诉我,在进行 3 次非易失性内存访问后进行一次volatile访问可能比volatile连续发出 3 次访问要好。这三个volatile内存访问是完全有序的(A happens-before B happens-before C)并限制编译器和处理器执行某些优化。非易失性版本在 A、B 和 C 之间建立无先行关系,因此为编译器和处理器提供更多自由来利用内存级并行/指令级并行。
随时随地看视频慕课网APP

相关分类

Java
我要回答