ABA问题

ABA的问题指的是在CAS更新的过程中,当读取到的值是A,然后准备赋值的时候仍然是A,但是实际上有可能A的值被改成了B,然后又被改回了A,这个CAS更新的漏洞就叫做ABA。

ABA可能带来的问题

1.数据结构破坏

案例:无锁链表的删除操作 假设链表结构为 A → B → C,线程 T1T2 并发操作:

  1. T1 读取头节点 A,准备删除 A,将头节点指向 B
  2. T2 抢先删除了 AB,插入新节点 D,再将头节点恢复为 A(比如插入新节点 A → D)。
  3. T1 执行 CAS,发现头节点仍为 A,于是将头节点指向 B结果:链表结构被破坏(B 可能已被释放,或 D 节点丢失)。

场景:无锁栈的出栈操作

  1. 初始状态:栈中有3个元素:A -> B -> C,top指向A。
  2. 线程1执行出栈,读取top为A,准备更新为B,此时线程1被挂起。
  3. 线程2依次出栈A和B,再将A重新入栈,top仍指向A。
  4. 线程1恢复,CAS操作认为top未改变,更新成功,但栈已被破坏。