CAS 与原子类

共 65 题
#

1. AtomicInteger 在高并发计数中的瓶颈

A 单点 CAS 竞争与缓存行 ping-pong ✓ 正确答案
B GC 压力
C 内存分配
D 线程创建
#

2. AtomicInteger 的 getAndIncrement 在高并发下的伪共享(False Sharing)问题与 @Contended

A 让字段变为原子
B 通过缓存行填充避免字段间的伪共享 ✓ 正确答案
C 提高 GC 效率
D 使变量不可变
#

3. AtomicInteger 的 weakCompareAndSet 与 compareAndSet 在失败语义、内存可见性和 CAS 循环写法上有哪些区别

A weak 保证 volatile 全序
B weak 允许伪失败且内存序弱,通常需放在循环中重试 ✓ 正确答案
C compareAndSet 允许伪失败
D 两者语义完全相同
#

4. AtomicInteger/AtomicReference 的 CAS 与内存序

A 仅线程本地
B 普通写
C volatile 写,具备全序可见性 ✓ 正确答案
D 无可见性保证
#

5. AtomicIntegerArray 与 AtomicLongArray 的数组原子性

A 多元素操作的原子性
B 数组的序列化
C 整个数组的原子拷贝
D 单个元素操作的原子性(如 getAndIncrement) ✓ 正确答案
#

6. AtomicIntegerArray 只保证单个元素操作原子,多元素不变量需要采用什么同步或版本化方案

A 用锁包裹整体操作,或用 AtomicReference 整体替换不可变对象/版本号校验 ✓ 正确答案
B 对每个元素分别 CAS 即可
C 忽略即可
D 用 volatile 数组
#

7. AtomicIntegerFieldUpdater 对目标字段的 volatile、类型和访问权限有哪些强制要求

A 必须是 static
B 必须是 final
C 必须是 volatile 且类型匹配、可访问 ✓ 正确答案
D 可以是普通字段
#

8. AtomicReference 与 volatile 引用在发布不可变对象时的取舍

A volatile 只保证可见性,AtomicReference 额外提供原子读-改-写(CAS) ✓ 正确答案
B 完全相同
C volatile 也可原子更新
D AtomicReference 可见性更弱
#

9. AtomicReference 与对象引用的原子更新

A 当前引用与期望相等时原子替换为 update ✓ 正确答案
B 使对象同步
C 让引用不可变
D 复制对象
#

10. CAS 与 Lock 在临界区大小不同场景下的吞吐取舍

A CAS,因为自旋更快
B 永远用 CAS
C 两者无差别
D Lock,因为长临界区下 CAS 自旋空转 CPU 且重试成本高 ✓ 正确答案
#

11. CAS 与锁的吞吐量对比(高竞争/低竞争)

A CAS 始终更高
B 两者相同
C 锁始终更低
D 锁通过阻塞调度,高竞争下吞吐常反超 CAS ✓ 正确答案
#

12. CAS 失败后丢弃预先分配的新对象会造成什么分配压力,怎样减少热点路径上的无效对象

A 用更多对象
B 每次失败都重新构造新对象
C 增加分配次数
D 失败时直接重试不重造,仅在必要时构造 ✓ 正确答案
#

13. CAS 循环在调度不公平时可能让单个线程长期饥饿,系统应通过哪些指标识别这种现象

A 高 CPU 空转、CAS 重试率升高、延迟长尾 ✓ 正确答案
B 无任何指标
C 线程数减少
D 内存占用低
#

14. CAS 操作在长自旋(Spin)下的 CPU 空转问题与 Backoff 策略

A 加快自旋
B 自旋失败后暂停/指数退避并加随机抖动,降低争用并避免同步活锁 ✓ 正确答案
C 增加空转
D 移除退避
#

15. CAS 自旋的开销与退避策略

A 无退避
B 指数退避 + 随机抖动,并设重试上限 ✓ 正确答案
C 只随机不指数
D 固定长时间等待
#

16. CAS(Compare-And-Swap)的硬件实现与 ABA 问题

A 线程死锁
B CAS 非原子
C 值从 A 变 B 再变 A,CAS 误判状态未变 ✓ 正确答案
D 内存不足
#

17. JDK 9 VarHandle 的原子访问模式

A 性能更差
B 无法 CAS
C 可对任意字段/数组元素原子操作并自定义内存序 ✓ 正确答案
D 只能操作基本类型
#

18. Java 9 VarHandle 的 release/acquire 模式与 volatile 演进

A 完全相同
B release/acquire 更强
C release/acquire 只约束单向重排,弱于 volatile 全序,开销更低 ✓ 正确答案
D volatile 更弱
#

19. Java 垃圾回收降低了无锁结构的内存回收难度,但为何仍不能自动消除逻辑 ABA

A GC 会增加 ABA
B 逻辑 ABA 是值回绕到相同导致 CAS 误判,与内存回收无关 ✓ 正确答案
C GC 会禁用 CAS
D GC 无法回收对象
#

20. Long/Double 的非原子写入与 JMM 处理

A 仅 volatile long/double 读写保证原子 ✓ 正确答案
B 所有 long/double 写都原子
C 仅基本类型
D 从不保证
#

21. LongAdder 与 AtomicLong 的伪共享优化

A 同步锁
B 更快的 CAS
C 单一变量
D 分段 Cell 数组 + @Contended 缓存行填充,避免伪共享 ✓ 正确答案
#

22. LongAdder.reset 与 sumThenReset 在并发更新时可能丢失怎样的观测,窗口统计应如何切换

A 可能丢失/重复计数,是近似窗口统计 ✓ 正确答案
B 是原子精确快照
C 会死锁
D 不可用
#

23. LongAdder.sum 为何不是原子快照,它适合监控计数却不适合作为哪些业务判断依据

A 日志计数
B 性能统计
C 精确业务判断(如余额、精确阈值) ✓ 正确答案
D 监控指标趋势
#

24. LongAdder/LongAccumulator(JDK 8+)在热点更新场景下对 AtomicLong 的性能优势

A 使用锁
B 分段 Cell 分散竞争,降低单点争用 ✓ 正确答案
C 更快的 CAS 指令
D 无分配
#

25. Striped64 的内部实现与 LongAdder 演化

A
B base + Cell[] 数组,通过冲突检测与扩容分散竞争 ✓ 正确答案
C 单一 volatile 变量
D 无锁链表
#

26. VarHandle 的 acquire/release 访问与 volatile 访问在可见性、排序和性能上有什么差异,何时可以降低内存序

A 需要全序
B 从不
C 任何时候
D 只需发布-获取单向传递时 ✓ 正确答案
#

27. VarHandle 的 plain、opaque、acquire、release 和 volatile 访问模式分别提供哪些排序保证

A plain
B release
C volatile ✓ 正确答案
D opaque
#

28. lock-free、wait-free 与 obstruction-free 分别保证谁能取得进展,CAS 循环通常属于哪一类

A 无保证
B wait-free
C obstruction-free
D lock-free(至少一个线程取得进展) ✓ 正确答案
#

29. volatile 与 synchronized 的差异(原子性 vs 可见性)

A 有序性
B 缓存一致性
C 可见性
D 原子性(读-改-写) ✓ 正确答案
#

30. 为什么 LongAdder 在高竞争计数下通常优于 AtomicLong,但其 sum() 不提供严格瞬时一致性,如何据此选型

A AtomicLong(精确读取) ✓ 正确答案
B LongAdder
C 两者一样
D 不用原子类
#

31. 伪共享如何让彼此独立的原子计数相互拖慢,缓存行填充的效果应怎样用硬件计数器验证

A 线程数
B 硬件计数器(cache miss、缓存行争用)与吞吐 ✓ 正确答案
C 内存大小
D 代码行数
#

32. 使用 AtomicReference 保存不可变聚合状态时,如何确保一次 CAS 同时维护多个字段的不变量

A 加锁并分字段写
B 封装为不可变对象后用一次 CAS 整体替换引用 ✓ 正确答案
C 多字段分别更新
D 用 volatile 数组
#

33. 原子更新函数若读取外部可变状态会产生什么竞态,如何把它改造成确定性的纯函数

A 是纯函数,只依赖传入参数、无副作用 ✓ 正确答案
B 可随机取值
C 可读取外部可变状态
D 可发送消息
#

34. 固定次数、指数退避和随机抖动在 CAS 高竞争下各解决什么问题,如何避免同步活锁

A 固定次数
B 增加线程
C 移除退避
D 随机抖动错峰重试 ✓ 正确答案
#

35. 把状态位和计数打包进一个 AtomicLong 有何原子性优势,位宽、符号扩展和溢出如何处理

A 无需掩码
B 更省内存
C 一次 CAS 原子更新多字段组合状态 ✓ 正确答案
D 更快
#

36. 无锁栈仅比较头节点引用时如何遭遇 ABA,版本戳与不可复用节点分别怎样缓解

A 复制引用
B 不可变
C CAS 时同时比较引用与版本号,版本变化使 CAS 失败 ✓ 正确答案
D 加锁
#

37. 用原子状态实现只执行一次的初始化时,如何表达进行中、成功和失败并保证等待者可恢复

A 无意义
B 通知等待者并允许重试,避免重复初始化 ✓ 正确答案
C 永久终止
D 加快初始化
#

38. 虚拟线程数量很大时共享 CAS 热点为何仍受 CPU 核数限制,增加任务数会怎样放大竞争

A CPU 核数与热点单点竞争 ✓ 正确答案
B 虚拟线程数量
C 内存
D 线程栈
#

39. 设计一个 CAS 自旋更新循环时,如何设置重试上限、退避策略与失败指标,避免高竞争下 CPU 长时间空转

A 增加线程
B 重试上限 + 退避 + 失败指标监控 ✓ 正确答案
C 无退避
D 无限自旋
#

40. 评估 AtomicLong 与 LongAdder 时,为什么必须同时测量写吞吐、读取频率和结果精确性

A 仅内存
B 写吞吐、读频率、结果精确性 ✓ 正确答案
C 仅写吞吐
D 仅读延迟
#

41. 请说明硬件 CAS 如何保证比较与写入的原子性,并结合 AtomicStampedReference 解释它怎样检测 ABA 问题

A CAS 同时比较引用与版本戳,戳变化使 CAS 失败 ✓ 正确答案
B 用哈希
C 复制引用
D 加锁
#

42. 轻量级锁(CAS + 自旋)与重量级锁(OS Mutex)的升级路径

A 无锁直接升级重量级
B 永不升级
C 竞争渐次加剧时从偏向/轻量 CAS 自旋升级到重量级 OS Mutex ✓ 正确答案
D 只降级
#

43. 高基数指标为每个标签创建 LongAdder 会造成什么内存问题,如何限制标签与回收计数器

A 无问题
B 更快
C 更省内存
D 内存膨胀与 GC 压力,需限制标签基数并回收不活跃计数器 ✓ 正确答案
#

44. 高并发使用 AtomicInteger 计数时可能出现哪些伪共享现象,@Contended 的使用限制和验证方法是什么

A 无需任何参数
B 无条件可用
C 加 -XX:-RestrictContended 参数,并承担内存占用 ✓ 正确答案
D 只用 synchronized
#

45. Atomic 类与 PhantomReference 的边界

A 加锁
B 对象回收后触发清理/资源管理 ✓ 正确答案
C 原子更新
D 计数
#

46. Atomic 类的 lazySet 与 set 的差异(内存序)

A lazySet 更强
B set 更快
C 完全相同
D lazySet 是 release 弱序,不保证立即可见但更快 ✓ 正确答案
#

47. AtomicInteger.getAndUpdate 的函数可能被重复执行,为何其中不能包含发送消息等副作用

A 无原因
B 副作用更快
C CAS 失败重试会重复执行函数,导致副作用重复 ✓ 正确答案
D 函数不会重复执行
#

48. AtomicInteger、AtomicLong、AtomicBoolean 的常用 API

A wait
B notify
C getAndIncrement ✓ 正确答案
D sleep
#

49. AtomicLong 计数溢出不会抛异常,长期运行的序列号或配额系统应如何检测并定义回绕语义

A 自动停止
B 静默回绕到负数,需主动检测并定义回绕语义 ✓ 正确答案
C 抛异常
D 归零
#

50. AtomicMarkableReference 只有布尔标记时适合表达什么状态,为何不能替代通用版本计数

A 二值标记状态(如是否已删除) ✓ 正确答案
B 多次代际变化
C 任意计数
D 时间戳
#

51. AtomicReferenceFieldUpdater 在框架中的应用

A 仅支持基本类型
B 更快
C 只能静态字段
D 避免为每个实例创建 AtomicReference 对象,直接对字段做 CAS ✓ 正确答案
#

52. AtomicStampedReference 与 AtomicMarkableReference 都能应对 ABA 时,版本戳和布尔标记分别适合哪些业务场景

A AtomicBoolean
B AtomicStampedReference(整数版本戳) ✓ 正确答案
C AtomicMarkableReference
D 任一都行
#

53. AtomicStampedReference 的版本号最终可能回绕,超长生命周期系统应如何评估残余 ABA 风险

A 用布尔标记
B 评估回绕周期 vs ABA 窗口,必要时扩位宽或配合不可复用节点 ✓ 正确答案
C 忽略
D 加锁
#

54. AtomicStampedReference 解决 ABA 问题的版本机制

A 只比较引用
B 引用与版本戳打包并同时比较,版本递增以区分代际 ✓ 正确答案
C 加锁
D 记录时间
#

55. DoubleAdder 的演进与使用场景

A 精确长整型计数
B 字符串累加
C 精确交易
D 高并发浮点累加统计,允许近似 ✓ 正确答案
#

56. FieldUpdater(AtomicIntegerFieldUpdater)的反射与安全

A 字段 volatile、类型匹配、可访问(含模块边界) ✓ 正确答案
B 字段无需 volatile
C 静态字段
D 任意字段
#

57. JDK 25 中 AtomicReferenceArray 的分段伪共享填充策略

A 需使用者按需用稀疏索引/分段填充缓解 ✓ 正确答案
B 无法解决
C 已自动解决
D 不存在
#

58. JDK 25 中 VarHandle 替代 Unsafe 的原子访问 API 设计

A 更慢
B 功能更少
C 类型安全、可移植、支持内存序控制,官方替代 Unsafe ✓ 正确答案
D 只支持 volatile
#

59. Java 25 中 Atomic 类的进一步演进

A 迁移到 VarHandle,保持 API 稳定 ✓ 正确答案
B synchronized
C 无变化
D Unsafe 直接调用
#

60. VarHandle 的 coordinate types 与 variable type 不匹配时会发生什么,调用模式为何是签名多态的

A 无作用
B 使方法更慢
C 只能用于 int
D 一个方法适配不同 variable/coordinate 类型,调用点做类型检查 ✓ 正确答案
#

61. VarHandle 的原子模式(AtomicAccess)在 JDK 25 中的方法签名与性能特征

A JIT 内联为底层原子指令,接近原生 CAS 性能 ✓ 正确答案
B 无法测量
C 极慢
D 必须加锁
#

62. VarHandle.fullFence、acquireFence 和 releaseFence 分别约束哪些前后操作,何时需要显式栅栏

A 完全内存屏障,约束前后所有操作的顺序与可见性 ✓ 正确答案
B 无作用
C 只约束读
D 只约束写
#

63. 使用 AtomicIntegerFieldUpdater 更新对象字段需要满足哪些字段可见性、类型和继承条件,为什么不直接使用 AtomicInteger

A 更简单
B 更快
C 零实例对象开销,但要求字段 volatile 且可访问 ✓ 正确答案
D 每个实例多一个对象
#

64. 如何用 AtomicReference 和不可变对象实现多字段一致更新,并避免读者观察到半更新状态

A 加锁分字段写
B 不可变对象 + 单次 CAS 整体替换引用 ✓ 正确答案
C 分字段更新
D volatile 数组
#

65. JDK 25 中 AtomicReference 的 compareAndSet 与 weakCompareAndSet 语义差异

A weak 更弱
B compareAndSet 允许伪失败
C 操作上等价(同为 volatile 强语义),弱语义走 VarHandle.weakCompareAndSetPlain ✓ 正确答案
D 语义完全不同