java - java原子整数可以在不声明值 volatile 的情况下实现吗?

标签 java volatile

我认为仅 CAS 就可以确保原子整数的原子性。那么为什么还要声明底层的 volatile 呢?

我知道 volatile 可以防止编译器和硬件重新排序,并确保指令顺序。但这在这里相关吗?

这里有什么问题吗?没有 volatile 会出现什么问题?

最佳答案

假设是Atomic*类(class)来自java.util.concurrent.atomic包。

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

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

这就是 volatile , final member variables或者锁定很有用。对对象的引用应该由多个线程正确共享。

重读问题后,我发现您可能会问为什么 value AtomicInteger 中的成员已声明volatile .对于初学者来说,并非所有方法都基于 unsafe.compareAndSwapInt ,有简单的setget直接访问 value字段,这足以说明该字段为 volatile 。我想知道 unsafe 也需要它操作。

关于java - java原子整数可以在不声明值 volatile 的情况下实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38988313/

相关文章:

java - 让滚动条与绝对定位一起工作

c - while(!volatile); 是做什么的?做?

java - Spring JPA findByDomainClass 生成错误的 where 子句

java - 了解C++,学习Java需要多长时间?

java - 在 Java 中使用集合中的通配符返回字符串列表的最快方法

c# - Interlocked.CompareExchange 也应该是一个 volatile 变量吗?

java - 将 ThreadLocal 与 Volatile 结合使用会产生不可预测的结果

c - 避免在函数调用中从 volatile static uint8_t 转换为 uint8_t?

c - 如果以下代码中没有 "volatile"关键字,编译器可以执行什么优化?

java - 如果 getter 或 setter 缺失(或不可见),则忽略 Jackson 中的属性