🔘 CAS

吞佛童子2022年10月10日
  • Java
  • CAS
小于 1 分钟

🔘 CAS

1. 原理

  1. 通过 处理器 的指令 保证 操作的 原子性
  2. 重要参数:
    • 变量内存地址
    • 旧的期望值
    • 要设置的新值
  3. 只有旧的期望值与实际当前值相同时,才可以更新为新值,否则说明存在并发问题

2. 存在问题

1) ABA

  • 概述:
    • 在 CAS 的过程中,发现 旧的期望值 为 A,便认为该过程中没有被其他线程改变,因此正常进行 CAS 修改值
    • 但实际上,旧的期望值可能被修改为 B,但是又被改回了 A 影响:
    • ABA 的问题大部分情况下并不影响并发的最终效果 解决:
    • 添加时间戳 | 版本号 进行区分

2) 循环时间开销大

  • 概述:
    • CAS 失败时,一般通过自旋,然后重新尝试 CAS
    • 若并发度过大,一直 CAS 失败,则一直自旋,对 CPU 开销影响较大 影响:
    • 适用于很快结束的场景

3) 只能保证一个共享变量的原子操作

  • 概述:
    • 只能保证一个变量的原子操作 解决:
    • 可以采用 AtomicReference 类
    • 使用锁
上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou