# 2. AtomicInteger 的 getAndIncrement 在高并发下的伪共享(False Sharing)问题与 @Contended A 让字段变为原子 B 通过缓存行填充避免字段间的伪共享 ✓ 正确答案 C 提高 GC 效率 D 使变量不可变
# 3. AtomicInteger 的 weakCompareAndSet 与 compareAndSet 在失败语义、内存可见性和 CAS 循环写法上有哪些区别 A weak 保证 volatile 全序 B weak 允许伪失败且内存序弱,通常需放在循环中重试 ✓ 正确答案 C compareAndSet 允许伪失败 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 可见性更弱
# 10. CAS 与 Lock 在临界区大小不同场景下的吞吐取舍 A CAS,因为自旋更快 B 永远用 CAS C 两者无差别 D Lock,因为长临界区下 CAS 自旋空转 CPU 且重试成本高 ✓ 正确答案
# 12. CAS 失败后丢弃预先分配的新对象会造成什么分配压力,怎样减少热点路径上的无效对象 A 用更多对象 B 每次失败都重新构造新对象 C 增加分配次数 D 失败时直接重试不重造,仅在必要时构造 ✓ 正确答案
# 13. CAS 循环在调度不公平时可能让单个线程长期饥饿,系统应通过哪些指标识别这种现象 A 高 CPU 空转、CAS 重试率升高、延迟长尾 ✓ 正确答案 B 无任何指标 C 线程数减少 D 内存占用低
# 14. CAS 操作在长自旋(Spin)下的 CPU 空转问题与 Backoff 策略 A 加快自旋 B 自旋失败后暂停/指数退避并加随机抖动,降低争用并避免同步活锁 ✓ 正确答案 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 不可用
# 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(至少一个线程取得进展) ✓ 正确答案
# 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 数组
# 39. 设计一个 CAS 自旋更新循环时,如何设置重试上限、退避策略与失败指标,避免高竞争下 CPU 长时间空转 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
# 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
# 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 加锁
# 56. FieldUpdater(AtomicIntegerFieldUpdater)的反射与安全 A 字段 volatile、类型匹配、可访问(含模块边界) ✓ 正确答案 B 字段无需 volatile C 静态字段 D 任意字段
# 58. JDK 25 中 VarHandle 替代 Unsafe 的原子访问 API 设计 A 更慢 B 功能更少 C 类型安全、可移植、支持内存序控制,官方替代 Unsafe ✓ 正确答案 D 只支持 volatile
# 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 语义完全不同