原子变量的可见性保证
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
.
阅读了很多关于 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
.