挥发物和原子之间的差异

问题描述 投票:0回答:1
int value = 0;
volatile boolean done = false;

// Thread A:
value = 1; done = true;

// Thread B:
if (done) System.out.println(value);

这很好,因为完成被定义为易失性。

相同的代码,除了将done定义为AtomicBoolean以外,它会实现相同的效果吗?换句话说,除了原子的和可见的之外,原子(RMW)操作是否还保证所有以前的写入都刷新到共享内存中?

int value = 0;
AtomicBoolean done = new AtomicBoolean(false);

// Thread A:
value = 1; done.set(true);

// Thread B:
if (done.get()) System.out.println(value);
java multithreading volatile atomicity
1个回答
2
投票

From the Javadoc of java.util.concurrent

[访问​​和更新原子的内存效果通常遵循volatile的规则,如Java语言规范(17.4内存模型)中所述:]

  • 获取具有读取易失性变量的存储效果。
  • 集合具有写入(分配)易失性变量的记忆效果。
  • ...

因此,在这种情况下,java.util.concurrentvolatile之间没有区别。

© www.soinside.com 2019 - 2024. All rights reserved.