🔘 CAS
2022年10月10日
- Java
🔘 CAS
1. 原理
- 通过 处理器 的指令 保证 操作的 原子性
- 重要参数:
- 变量内存地址
- 旧的期望值
- 要设置的新值
- 只有旧的期望值与实际当前值相同时,才可以更新为新值,否则说明存在并发问题
2. 存在问题
1) ABA
- 概述:
- 在 CAS 的过程中,发现 旧的期望值 为 A,便认为该过程中没有被其他线程改变,因此正常进行 CAS 修改值
- 但实际上,旧的期望值可能被修改为 B,但是又被改回了 A 影响:
- ABA 的问题大部分情况下并不影响并发的最终效果 解决:
- 添加时间戳 | 版本号 进行区分
2) 循环时间开销大
- 概述:
- CAS 失败时,一般通过自旋,然后重新尝试 CAS
- 若并发度过大,一直 CAS 失败,则一直自旋,对 CPU 开销影响较大 影响:
- 适用于很快结束的场景
3) 只能保证一个共享变量的原子操作
- 概述:
- 只能保证一个变量的原子操作 解决:
- 可以采用 AtomicReference 类
- 使用锁