在阅读了大量关于挥发性、原子性和可见性的文章之后,还有一个问题。当“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。
3条答案
按热度按时间nfg76nw01#
a保证在这里一直是1???
不,其他的
set
电话可能发生在这两者之间。不过,这也是真实的
volatile
案例。jhiyze9q2#
如果文件没有明确规定:
将变量的值设置为newvalue,内存语义为setting,就好像变量声明为volatile一样。
如果这是你唯一的代码
AtomicInteger
,那么是的,a
保证是1
.dldeef673#
一
get()
相当于从一个volatile
变量和set()
相当于给它写信。我们在这里有一个happens-before关系write->read,因此,“a保证在这里一直是1”。当然,只有这两个线程在执行。