并发 · 单选题 · 第 20 题
Java 后端开发面试 · 第 20 题
使用 CAS 时可能遇到 ABA 问题,常见的解决办法是?
- A把共享变量改成用 volatile 修饰,保证可见性
- B使用带版本号的 AtomicStampedReference
- C增加 CAS 失败后的自旋重试次数直到成功
- D把引用换成 AtomicInteger 再做 CAS 比较
答案
B B. 使用带版本号的 AtomicStampedReference
解析
ABA 指值从 A 改成 B 又改回 A,CAS 只比较值,会误以为没有变化。加上版本号或时间戳后,每次修改版本都会递增,CAS 同时比较值和版本就能发现中间的变化。volatile 只解决可见性,增加自旋次数和换成 AtomicInteger 都不会改变「只比较值」这一点。