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

标签 java multithreading concurrency volatile

以下问题:

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/

相关文章:

java - 编译我的项目时是否编译依赖项本身?

java - 最后处理某些流元素

java - 在构建开始之前运行 bash 脚本

java - 使用字节数组降低内存消耗

java - Java如何正确添加同步

multithreading - forkOn 和 -qm RTS 标志之间有什么关系?

java - Collectors.joining (",") 是线程安全的吗?

javascript - `npm install`是否支持并发运行?

java - 如何在运行时在方法中 Autowiring 类

c++ - linux中C/C++向其他独立进程发送中断信号