CAS面试题总结
CAS是比synchronized更轻量的方式。CAS的核心先比较内存中的当前值是否和线程预期的旧值一致一致则替换为新值不一致则不替换重新尝试。CAS的三个参数分别是V、A、BV内存中的当前值主内存中存储的变量值A线程的预期旧值线程从主内存中读取后存在本地的数值B线程要修改的新值线程计算后想要写入主内存的数值CAS的执行过程。线程首先从主内存读取变量值V并保存为预期值A然后根据业务逻辑计算出新值B最后执行CAS原子操作比较主内存当前值是否仍为A若相等则更新为B并成功否则说明变量已被其他线程修改线程将重新读取最新值并重复整个流程即自旋重试直至操作成功。Java中CAS的应用核心工具有Atomic原子类Java的java.util.concurrent.atomic包下的原子类全部基于CAS实现无需手动写CAS逻辑直接调用方法即可实现线程安全的变量操作。核心方法compareAndSet()、incrementAndGet()自旋特性。compareAndSet()“预期值与内存值不一致时修改失败”的效果incrementAndGet()强调“自旋”的含义——失败不阻塞循环重试这是CAS无锁的核心特性。CAS为什么是原子的CAS的原子性体现在CAS进行比较和交换两步操作时不会被其他线程打断。CAS的原子性由CPU硬件指令保证整个“比较交换”过程不可分割不会被其他线程或CPU中断CAS的问题与解决方案1. 问题1自旋消耗CPU问题描述高并发下多个线程同时修改同一个变量CAS频繁失败线程会一直循环重试占用大量CPU资源解决方案限制自旋次数如Java中的LongAdder类采用分段锁自旋结合的方式避免无限重试。2. 问题2只能保证单个变量的原子性问题描述CAS一次只能操作一个变量若需要同时修改多个变量无法保证原子性解决方案用AtomicReference封装对象将多个变量封装到一个对象中或使用synchronized锁。3. 问题3ABA问题最经典重点讲解问题场景结合案例主内存中变量值VA线程1读取V保存预期值A线程2先修改VA→B再修改VB→A线程1执行CAS发现VA和预期值一致执行修改但此时变量中间被修改过某些业务场景会出错如银行转账、库存扣减。问题本质只比较“值”不关注“修改过程”解决方案加版本号使用AtomicStampedReference类每次修改变量时版本号1CAS比较时同时比较“值版本号”只有两者都一致才执行交换。代码演示简化展示AtomicStampedReference的使用让学生看到“版本号值”的双重校验。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2444009.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!