CAS与ABA问题

2020-05-08  本文已影响0人  睦月MTK

声明:不足之处,请指正


一、CAS与ABA

二、ABA的解决方法
//0是版本号
AtomicStampedReference atomicStampedRef = new AtomicStampedReference(100, 0);

三、附上经典的ABA问题

现有一个用单向链表实现的堆栈,栈顶为A,这时线程T1已经知道A.next为B,然后希望用CAS将栈顶替换为B:

head.compareAndSet(A,B);

在T1执行上面这条指令之前,线程T2介入,将A、B出栈,再pushD、C、A,此时堆栈结构如下图,而对象B此时处于游离状态:

此时轮到线程T1执行CAS操作,检测发现栈顶仍为A,所以CAS成功,栈顶变为B,但实际上B.next为null,所以此时的情况变为:

其中堆栈中只有B一个元素,C和D组成的链表不再存在于堆栈中,平白无故就把C、D丢掉了。


参考文档:
[1] 用AtomicStampedReference解决ABA问题

上一篇 下一篇

猜你喜欢

热点阅读