原子类因多线程下count++等操作非原子而需存在,靠CAS+volatile+Unsafe实现无锁线程安全,适用于计数器、状态标志、对象引用更新、数组元素统计及已有对象字段原子修改等场景。

面试中讲原子类,重点不是背名字,而是说清“为什么需要它”“它靠什么工作”“用在哪儿合适”。下面分三块说清楚,逻辑顺、不绕弯。
底层原理:CAS + volatile + Unsafe 三位一体
原子类不是靠加锁实现线程安全的,而是靠硬件级指令和内存模型保障:
- CAS(Compare-And-Swap):核心机制。每次更新前先检查当前值是否还是自己上次读到的值;是,才写入新值;否则重试。就像“确认门没被别人动过,才进门换东西”。
- volatile 修饰 value 字段:保证所有线程看到的都是最新值(可见性),同时禁止编译器/处理器对相关读写做重排序(有序性)。
- Unsafe 类调用 native 方法:AtomicInteger 的 incrementAndGet() 最终调用的是 Unsafe.compareAndSwapInt(),直接操作内存地址,绕过 JVM 普通读写流程。
分类要按“操作目标”来记,别死背类名
记住四类,每类对应一类实际问题:
- 基本类型原子类:AtomicInteger、AtomicLong、AtomicBoolean。适合计数器、开关标志、状态码等简单变量更新。
- 引用类型原子类:AtomicReference(普通对象替换)、AtomicStampedReference(带版本号,防 ABA)、AtomicMarkableReference(带布尔标记,轻量防 ABA)。
- 数组原子类:AtomicIntegerArray 等。适用于需要单独原子更新数组某一项的场景,比如分段统计、哈希桶计数。
- 字段更新器:AtomicIntegerFieldUpdater 等。用于已存在对象的 volatile 字段做原子更新,避免为单个字段额外包装对象。
补充一个高频考点:ABA 问题怎么理解?
不是“有没有变过”,而是“有没有被中间改过又改回来”。比如栈顶元素从 A → B → A,CAS 会误认为没变,可能破坏逻辑(如链表节点复用)。AtomicStampedReference 通过给引用配一个递增版本号解决;AtomicMarkableReference 则只关心“是否被改过”,用布尔标记代替数字,更轻量。
立即学习“Java免费学习笔记(深入)”;


















