在阅读了大量关于易失性、原子性和可见性的内容后,还有一个问题。在线程之间的工作之后;a";始终可见;b";更新/读取:
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包装了一个volatile。
get()
相当于从volatile
变量中读取,set()
相当于向其写入。我们在这里有一个发生在之前的关系write->读取并因此;a保证在这里一直是1";。当然,这是在只有这两个线程执行的情况下进行的。
如果文档没有明确指定:
将变量的值设置为newValue,内存语义设置为,就好像变量被声明为volatile一样。
如果这是您在该AtomicInteger
上工作的仅有的代码,那么是的,a
保证是1
。
a保证始终为1???
不,其他set
调用也可能发生在两者之间。
但在volatile
的情况下也是如此。