请说明你使用过哪些 Java 原子类,并描述它们各自的特点、适用场景以及底层实现原理。
考察说明
考察候选人对 Java 原子类的掌握程度,包括分类、原理和典型应用。
回答思路
- 【回答框架 1】原子类位于 java.util.concurrent.atomic 包,主要分为基本类型原子类(AtomicInteger、AtomicLong、AtomicBoolean)、数组原子类(AtomicIntegerArray 等)、引用原子类(AtomicReference、AtomicStampedReference、AtomicMarkableReference)和字段更新器(AtomicIntegerFieldUpdater 等)。
- 【回答框架 2】底层实现基于 CAS(比较并交换)和 volatile 变量,通过 Unsafe 类提供硬件级别的原子操作,保证单个变量的原子性,避免 synchronized 的重量级开销。
- 【回答框架 3】适用范围:计数器、序列生成、状态标志等高频更新场景;ABA 问题可通过 AtomicStampedReference 或 AtomicMarkableReference 解决。
- 【回答框架 4】在 Java 8 之后,LongAdder 和 LongAccumulator 通过分段累加减少竞争,适用于高并发统计场景。
- 【关键点 1】原子类涵盖基本类型、数组、引用和字段更新器四大类。
- 【关键点 2】核心原理是 CAS 操作,依赖 Unsafe 类实现硬件级原子性。
- 【关键点 3】CAS 存在 ABA 问题,可用版本号或标记解决。
- 【关键点 4】LongAdder 通过分段累加提升高并发写入性能。
- 【关键点 5】原子类仅保证单个变量的原子性,复合操作需配合锁或事务。
- 【易错点 1】误以为原子类可以替代所有同步场景,忽略复合操作的原子性需求。
- 【易错点 2】忽略 ABA 问题在无锁算法中的影响。
- 【易错点 3】高并发下 AtomicLong 可能因自旋竞争导致性能下降,应优先考虑 LongAdder。