compare and swap ABA 问题和解决方案

CAS ABA 问题图解

在这里插入图片描述

如上图所示三个线程 T1,T2,T3 更新内存中的值 V。具体执行时刻沿着时间线。

  1. T1T2 同时读取到内存中的值 V,保存到线程私有变量 A 此时 A的值为 100
  2. T1 线程的 A = 100 (也就是当前线程私有保存的 V 的一份拷贝),计算 B = A - 50, 此时比较 A 和 V 相等,将 V 的值更新为 50
  3. T2 被阻塞。
  4. T3 读取到 V = 50,保存在 A 中。计算 B = A + 50 = 100,比较 A 和 V 的值,相等。将 V 的值更新为 100。注意此时内存中的 V 的值经历了从 100->50->100 的过程,这就是所谓的 ABA 问题
  5. T2 接着执行,计算 B = A - 50 = 50。比较 A 和 V 的值,相等。将V 的值更新为 50

解决方案

本质原因:内存中 V 的值经过了改变,又变回了原值。但是没有记录这个变化过程。
怎么办?
加一个版本号来记录 V 的版本。这就是代价,要表示这个变化过程的代价。

解决 ABA 问题图解

CAS 更新成功条件

  1. V = A
  2. 版本相同
    在这里插入图片描述
  3. 可以看到 T1 和 T2 读取到的 version 都是 01
  4. T1 执行完成后,更新内存中 V 的值为 50,版本号为 02
  5. T3 执行完成后,更新内存中 V 的值为 100,版本号为 03
  6. T2 读取到的 version 是 01,but 此时内存中的 version 是 03,版本不匹配 T2 更新失败。

Reference

  1. cas
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值