Java面试题更新 2026-08-05

请解释 Java 中 AtomicInteger 类的实现原理,并说明 CAS(Compare-And-Swap)的用法。

技术原理Java

考察说明

考察对 AtomicInteger 底层同步机制及 CAS 原理的理解。

回答思路

  1. 【回答框架 1】AtomicInteger 通过 volatile 变量和 CAS 操作实现线程安全的原子更新。其底层依赖 sun.misc.Unsafe 提供的 compareAndSwapInt 方法,结合 volatile 保证可见性,CAS 保证原子性。
  2. 【回答框架 2】CAS 操作包含三个操作数:内存位置 V、预期值 A 和新值 B。仅当 V 的值等于 A 时,才将 V 更新为 B,否则不操作,整个过程是原子的。Unsafe 的 compareAndSwapInt 直接调用 CPU 的 cmpxchg 指令实现。
  3. 【回答框架 3】使用 CAS 的典型场景是自旋更新,如 getAndIncrement 方法:循环获取当前值,尝试 CAS 更新为新值,失败则重试,直到成功。这避免了加锁的开销,但可能带来 ABA 问题。
  4. 【回答框架 4】ABA 问题是指变量从 A 变为 B 再变回 A,CAS 无法察觉变化。解决方案是使用 AtomicStampedReference 或 AtomicMarkableReference,通过版本号或标记来避免。
  5. 【关键点 1】AtomicInteger 利用 volatile 和 CAS 实现无锁原子操作。
  6. 【关键点 2】CAS 基于 Unsafe 的 compareAndSwapInt,底层为 CPU 原子指令。
  7. 【关键点 3】适用场景:高并发下单一计数器操作,避免线程阻塞。
  8. 【关键点 4】CAS 存在 ABA 问题,需用带版本号的原子类解决。
  9. 【关键点 5】自旋操作在竞争激烈时可能导致 CPU 开销高,可考虑 LongAdder 等分段累加器。
  10. 【易错点 1】误认为 CAS 能解决所有并发问题,实际仅适用于简单原子操作。
  11. 【易错点 2】忽略 ABA 问题,在需要严格一致性的场景下可能造成逻辑错误。
  12. 【易错点 3】自旋重试在长时间不成功时可能浪费 CPU 资源,应考虑其他策略。