java - 通过未修改的原子引用的突变是否可见?

标签 java multithreading concurrency java.util.concurrent java-memory-model

假设我有一个对可变类类型 Foo 的原子引用:

AtomicReference<Foo> foo = new AtomicReference<Foo>(new Foo());

线程 A 写入 Foo 对象:

foo.get().write(42);

线程 B 从 Foo 对象中读取:

int x = foo.get().read();

请注意,原子引用本身永远不会被修改!也就是说,我没有在我的代码中调用 foo.set

线程 B 是否保证观察到线程 A 最后写入的值?

最佳答案

Is thread B guaranteed to observe the value that was last written by thread A?

没有。这相当于:

volatile Foo foo = new Foo();
foo.write(42);

在 foo 为非空之后,所有在 foo 初始分配之前发生的写入都将可见。然而,在那之后,无法保证线程何时会看到 foo.write(42) 的写入发生。

关于java - 通过未修改的原子引用的突变是否可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25191804/

相关文章:

java - IBM 队列管理器连接失败并出现以下错误

java - Selenium 与 TestNG 和 Java 中的数据提供程序不匹配错误 | org.testng.internal.reflect.MethodMatcherException

c++ - 在无尽的 C++ 程序中线程化

multithreading - 当 Async 值被垃圾收集时会发生什么?

java - 线程安全地在两个数组列表之间移动数组列表元素

java - 读取xml文件后防止文件 channel 关闭

scala - scalaz.concurrent.Future 与 scalaz.ContT[Trampoline, Unit, 相比有什么好处?]

java - 在没有互联网连接的计算机上使用 Scala

java - 如何在java中的代理服务器上缓存http请求?

c++ - 如果父线程 id 没有作为 pthread_create 的参数传入,是否有可能从 C/C++ 的线程内获取父线程 id?