Java原子类:CAS与volatile的无锁奥秘

Java中的原子类位于java.util.concurrent.atomic包下,根据功能可分为四类,其核心原理均基于 volatile变量保证内存可见性CAS(Compare-and-Swap)操作保证原子性


⚛️ 一、基本类型原子类

  1. AtomicBoolean
    • 原理 :内部用volatile int value存储状态(0=false,1=true),通过Unsafe的compareAndSwapInt实现原子更新。
  2. AtomicInteger
    • 原理 :通过volatile int value存储值,使用Unsafe的getAndAddInt等CAS操作实现原子增减(如incrementAndGet())。
  3. AtomicLong
    • 原理 :类似AtomicInteger,使用volatile long value和CAS操作;64位系统需处理64位对齐问题。

🔢 二、数组类型原子类

  1. AtomicIntegerArray
    • 原理 :内部维护final int[] array,计算元素偏移地址后通过Unsafe的CAS操作数组元素。
  2. AtomicLongArray
    • 原理 :类似AtomicIntegerArray,支持long数组的原子操作。
  3. AtomicReferenceArray
    • 原理 :通过偏移地址和compareAndSwapObject实现引用类型数组元素的原子替换。

🔗 三、引用类型原子类

  1. AtomicReference<V>
    • 原理 :通过volatile V value存储引用,Unsafe的compareAndSwapObject实现引用的原子替换。
  2. AtomicStampedReference<V>
    • 原理 :在引用基础上增加int stamp(版本戳),解决CAS的ABA问题(同时检查引用和版本戳)。
  3. AtomicMarkableReference<V>
    • 原理 :用布尔标记(boolean mark)替代版本戳,简化ABA问题处理。

🛠️ 四、字段更新器

  1. AtomicIntegerFieldUpdater<T>
    • 原理 :通过反射更新目标类的volatile int字段,底层使用CAS保证原子性。
  2. AtomicLongFieldUpdater<T>
    • 原理 :类似上述,支持long字段。
  3. AtomicReferenceFieldUpdater<T,V>
    • 原理:支持引用类型字段的原子更新,依赖反射和CAS。

🔬 原理共性总结

  1. 内存可见性 :所有原子类内部使用volatile修饰变量,确保多线程下读取最新值。
  2. 原子性保障 :依赖Unsafe类的CAS操作(如compareAndSwapInt),自旋重试直到更新成功。
  3. 无锁优化 :相比synchronized,CAS避免线程阻塞,提升高并发性能。

⚠️ 注意:原子类仅适用于单个变量的简单操作(如增减、替换)。复杂逻辑仍需锁或其他同步机制。

相关推荐
你怎么知道我是队长12 小时前
C语言---枚举变量
c语言·开发语言
李慕婉学姐12 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
吃茄子的猫12 小时前
quecpython中&的具体含义和使用场景
开发语言·python
云栖梦泽12 小时前
易语言中小微企业Windows桌面端IoT监控与控制
开发语言
数据大魔方12 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
奋进的芋圆13 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin14 小时前
设计模式之桥接模式
java·设计模式·桥接模式
Edward.W14 小时前
Python uv:新一代Python包管理工具,彻底改变开发体验
开发语言·python·uv
小熊officer14 小时前
Python字符串
开发语言·数据库·python
model200514 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端