原子变量的可见性保证

Visibility guarantees of atomic variables

阅读了很多关于 volatile、atomic 和可见性的内容后,仍然存在一个问题。以下跨线程工作,当“b”为updated/read:

时,“a”始终可见
int a;
volatile int b;
a = 1; b = 1;
...
// different thread
if (b == 1) // do something with a, which is 1 now

同样适用于原子变量,它们是独立的对象,以下是否有效?

int a;
AtomicInteger b = new AtomicInteger();
a = 1; b.set(1);
...
// different thread
if (b.get() == 1) // a guaranteed to be 1 here all the time ???

如果答案是否定的,那么应该可以扩展 AtomicInteger class 并在其中包含“a”,因为 AtomicInteger 包装了一个 volatile。

a guaranteed to be 1 here all the time ???

不,其他 set 调用可能发生在两者之间。

但是 volatile 的情况也是如此。

A get() 相当于从 volatile 变量读取,set() 相当于写入它。我们在这里有一个 happens-before 关系 write -> read 因此,“a guarantee to be 1 here all time”。这当然是在只有这两个线程执行的情况下。

要是文档没有明确说明就好了:

Sets the value of a variable to the newValue, with memory semantics of setting as if the variable was declared volatile.

如果那是 唯一的 代码,那么 AtomicInteger,那么是的,a 肯定是 1 .