原子变量的可见性保证



在阅读了大量关于易失性、原子性和可见性的内容后,还有一个问题。在线程之间的工作之后;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的情况下也是如此。

相关内容

  • 没有找到相关文章

最新更新