我认为仅 CAS
就可以确保原子整数的原子性。那么为什么还要声明底层的值
volatile
呢?
我知道 volatile
可以防止编译器和硬件重新排序,并确保指令顺序。但这在这里相关吗?
这里有什么问题吗?没有 volatile
会出现什么问题?
最佳答案
假设是Atomic*
类(class)来自java.util.concurrent.atomic
包。
您正在谈论两个不同的概念:对原子对象的引用和原子对象本身。
确实,CAS
同一个原子整数对象是原子的。但我们如何确定 compareAndSet
两个线程中的方法调用应用于同一个对象?就像任何由多个线程共享的 java 对象一样,这与 safe-publication 相关。 [原子]对象的。
这就是 volatile
, final member variables
或者锁定很有用。对对象的引用应该由多个线程正确共享。
重读问题后,我发现您可能会问为什么 value
AtomicInteger
中的成员已声明volatile
.对于初学者来说,并非所有方法都基于 unsafe.compareAndSwapInt
,有简单的set
和get
直接访问 value
字段,这足以说明该字段为 volatile
。我想知道 unsafe
也需要它操作。
关于java - java原子整数可以在不声明值 volatile 的情况下实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38988313/