来自 JavaAtomicReferenceFieldUpdater
文档:
请注意,
compareAndSet
此类中方法的保证比其他原子类中的要弱。因为这个类不能确保该字段的所有使用都适合原子访问的目的,所以它只能保证对 and 的其他调用的原子性和易失性compareAndSet
语义set
。
这意味着我不能与 一起进行正常的易失性写入compareAndSet
,但必须set
改用。它没有提到任何关于get
.
这是否意味着我仍然可以读取具有相同原子性保证的 volatile 字段 - 之前的所有写入set
或compareAndSet
对所有读取 volatile 字段的人都是可见的?
还是我必须在现场使用get
而AtomicReferenceFieldUpdater
不是 volatile 读取?
如果您有参考资料,请张贴参考资料。
谢谢你。
编辑:
从Java Concurrency in Practice中,他们唯一说的是:
更新程序类的原子性保证比常规原子类要弱,因为你不能保证底层字段不会被直接修改 - compareAndSet 和算术方法只保证使用原子字段更新程序方法的其他线程的原子性。
同样,没有提及其他线程应该如何读取这些易失性字段。
另外,我是否可以假设“直接修改”是常规的易失性写入?