java—原子变量的可见性保证

uurity8g  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(302)

在阅读了大量关于挥发性、原子性和可见性的文章之后,还有一个问题。当“b”被更新/读取时,线程中的“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类并在其中包含“a”,因为atomicinteger Package 了volatile。

nfg76nw0

nfg76nw01#

a保证在这里一直是1???
不,其他的 set 电话可能发生在这两者之间。
不过,这也是真实的 volatile 案例。

jhiyze9q

jhiyze9q2#

如果文件没有明确规定:
将变量的值设置为newvalue,内存语义为setting,就好像变量声明为volatile一样。
如果这是你唯一的代码 AtomicInteger ,那么是的, a 保证是 1 .

dldeef67

dldeef673#

get() 相当于从一个 volatile 变量和 set() 相当于给它写信。我们在这里有一个happens-before关系write->read,因此,“a保证在这里一直是1”。当然,只有这两个线程在执行。

相关问题