java:在一个变量上使用 volatile VS 每个变量
java: using volatile at one variable VS each variable
以下问题:
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 变量更好吗,还是我应该让每个变量都可以 write/read on valatile?
如果我在我的第二个解决方案中每次都对我的 memoryBarrier 写入 true,可以触发写-读-发生在 java 中的关系语义之前吗?我猜它没有被优化掉?
总结如下:
我的解决方案 1 和 2 在语义上是否相同?
解决方案2更好吗?
我是否可以始终将相同的值写入易失性变量以获得 read/write 易失性 happensbefore-relationsship?
该示例非常简单,因此您可能看不到性能方面的太大差异。
我的直觉告诉我,先进行 3 次非易失性内存访问然后进行一次 volatile
访问可能比连续发出 3 次 volatile
访问要好。
这三个 volatile
内存访问是完全有序的(A happens-before B happens-before C)并限制编译器和处理器执行某些优化。非易失性版本在 A、B 和 C 之间建立无先行关系,因此为编译器和处理器提供更多自由来利用内存级 parallelism/instruction-level 并行性。
以下问题:
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 变量更好吗,还是我应该让每个变量都可以 write/read on valatile?
如果我在我的第二个解决方案中每次都对我的 memoryBarrier 写入 true,可以触发写-读-发生在 java 中的关系语义之前吗?我猜它没有被优化掉?
总结如下: 我的解决方案 1 和 2 在语义上是否相同? 解决方案2更好吗? 我是否可以始终将相同的值写入易失性变量以获得 read/write 易失性 happensbefore-relationsship?
该示例非常简单,因此您可能看不到性能方面的太大差异。
我的直觉告诉我,先进行 3 次非易失性内存访问然后进行一次 volatile
访问可能比连续发出 3 次 volatile
访问要好。
这三个 volatile
内存访问是完全有序的(A happens-before B happens-before C)并限制编译器和处理器执行某些优化。非易失性版本在 A、B 和 C 之间建立无先行关系,因此为编译器和处理器提供更多自由来利用内存级 parallelism/instruction-level 并行性。