单独发生CAS
就可以确保原子整数的原子性。那么为什么还要声明基础value
volatile
?
我知道volatile
会阻止编译器和硬件重新排序,并确保指令顺序。但这是相关的吗?
这里有什么问题?没有volatile
会有什么问题?
答案 0 :(得分:3)
假设它是Atomic*
包中的java.util.concurrent.atomic
类。
您正在谈论两个不同的概念:对原子对象的引用和原子对象本身。
是的,相同的原子整数对象上的CAS
是原子的。但是,我们如何确保将两个线程中的compareAndSet
方法调用应用于同一个对象?就像多个线程共享的任何java对象一样,这与[atomic]对象的safe-publication相关。
这是volatile
,final member variables
或锁定有用的地方。对象的引用应该由多个线程正确共享。
在重新阅读问题后,我发现您可能会问为什么value
AtomicInteger
成员被宣布为volatile
。对于初学者而言,并非所有方法都是根据{{1}},可以直接访问unsafe.compareAndSwapInt
字段的简单set
和get
,这足以说明此字段为value
。我不知道volatile
操作也需要它。
答案 1 :(得分:2)
对于声明为volatile的所有变量(包括长变量和双变量),读取和写入都是原子的。
...但是,这并不能消除所有同步原子操作的需要,因为仍然可能存在内存一致性错误。使用volatile变量可以降低内存一致性错误的风险,因为对volatile变量的任何写入都会建立与之后读取同一变量的先发生关系。