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);
From the Javadoc of java.util.concurrent
:
[访问和更新原子的内存效果通常遵循volatile的规则,如Java语言规范(17.4内存模型)中所述:]
- 获取具有读取易失性变量的存储效果。
- 集合具有写入(分配)易失性变量的记忆效果。
- ...
因此,在这种情况下,java.util.concurrent
和volatile
之间没有区别。