CAS中的ABA问题
ABA问题
ABA的问题指的是在CAS更新的过程中,当读取到的值是A,然后准备赋值的时候仍然是A,但是实际上有可能A的值被改成了B,然后又被改回了A,这个CAS更新的漏洞就叫做ABA。
ABA可能带来的问题
1.数据结构破坏
案例:无锁链表的删除操作 假设链表结构为
A → B → C,线程 T1 和 T2
并发操作:
- T1 读取头节点
A,准备删除A,将头节点指向B。 - T2 抢先删除了
A和B,插入新节点D,再将头节点恢复为A(比如插入新节点A → D)。 - T1 执行 CAS,发现头节点仍为
A,于是将头节点指向B。 结果:链表结构被破坏(B可能已被释放,或D节点丢失)。
场景:无锁栈的出栈操作
- 初始状态:栈中有3个元素:A -> B ->
C,
top指向A。 - 线程1执行出栈,读取
top为A,准备更新为B,此时线程1被挂起。 - 线程2依次出栈A和B,再将A重新入栈,
top仍指向A。 - 线程1恢复,CAS操作认为
top未改变,更新成功,但栈已被破坏。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Torch's blog!

