如何解决原子变量的可见性保证
阅读了大量有关 volatile、atomic 和可见性的内容后,仍然存在一个问题。以下跨线程工作,当更新/读取“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 包装了一个 volatile。
解决方法
get()
相当于从 volatile
变量中读取,而 set()
相当于写入。我们有一个 happens-before 关系,这里写 -> 读,因此,“a 保证始终为 1”。这当然是在仅执行这两个线程的上下文中。
如果文档没有明确指定:
将变量的值设置为 newValue,具有设置就好像变量被声明为 volatile 的内存语义。
如果这是您对 AtomicInteger
使用的唯一代码,那么是的,a
保证为 1
。
a 保证始终为 1 ???
不,其他 set
调用可能发生在两者之间。
但在 volatile
的情况下也是如此。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。