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!