可以实现java原子整数而不声明值volatile吗?

时间:2016-08-17 04:49:40

标签: java volatile

单独发生CAS就可以确保原子整数的原子性。那么为什么还要声明基础value volatile

我知道volatile会阻止编译器和硬件重新排序,并确保指令顺序。但这是相关的吗?

这里有什么问题?没有volatile会有什么问题?

2 个答案:

答案 0 :(得分:3)

假设它是Atomic*包中的java.util.concurrent.atomic类。

您正在谈论两个不同的概念:对原子对象的引用和原子对象本身。

是的,相同的原子整数对象上的CAS是原子的。但是,我们如何确保将两个线程中的compareAndSet方法调用应用于同一个对象?就像多个线程共享的任何java对象一样,这与[atomic]对象的safe-publication相关

这是volatilefinal member variables或锁定有用的地方。对象的引用应该由多个线程正确共享。

在重新阅读问题后,我发现您可能会问为什么value AtomicInteger成员被宣布为volatile对于初学者而言,并非所有方法都是根据{{​​1}},可以直接访问unsafe.compareAndSwapInt字段的简单setget,这足以说明此字段为value。我不知道volatile操作也需要它。

答案 1 :(得分:2)

引用Oracle documentation

对于声明为volatile的所有变量(包括长变量和双变量),读取和写入都是原子的。

...但是,这并不能消除所有同步原子操作的需要,因为仍然可能存在内存一致性错误。使用volatile变量可以降低内存一致性错误的风险,因为对volatile变量的任何写入都会建立与之后读取同一变量的先发生关系。