ABA问题

作者: 疯癫的猪猪猪 | 来源:发表于2019-03-22 15:01 被阅读0次

CAS会导致“ABA问题”。

线程1准备用CAS将变量的值由A替换为C,在此之前,线程2将变量的值由A替换为B,又由B替换为A,然后线程1执行CAS时发现变量的值仍然为A,所以CAS成功。但实际上这时的现场已经和最初不同了,尽管CAS成功,但可能存在潜藏的问题。

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

在T1执行上面这条指令之前,线程T2介入,将A、B出栈,再pushD、C、A;

此时轮到线程T1执行CAS操作,检测发现栈顶仍为A,所以CAS成功,栈顶变为B,但实际上B.next为null,所以此时的情况变为:堆栈中只有B一个元素,C和D组成的链表不再存在于堆栈中,C、D丢掉了。

Java并发包为了解决这个问题,提供了一个带有标记的原子引用类“AtomicStampedReference”,它可以通过控制变量值的版本来保证CAS的正确性。每次在执行数据的修改操作时,都会带上一个版本号,一旦版本号和数据的版本号一致就可以执行修改操作并对版本号执行+1操作,否则就执行失败。

相关文章

  • 死磕 java并发包之AtomicStampedReferenc

    问题 (1)什么是ABA? (2)ABA的危害? (3)ABA的解决方法? (4)AtomicStampedRef...

  • 原子操作 CAS CompareAndSwap

    参考 Java CAS ABA问题发生的场景分析 提到了ABA问题 Unsafe$compareAndSwapIn...

  • ABA问题

    CAS会导致“ABA问题”。 线程1准备用CAS将变量的值由A替换为C,在此之前,线程2将变量的值由A替换为B,又...

  • 细谈CAS与ABA

    题目:如何实现乐观锁(CAS),如何避免ABA问题? 这个题主要考查原子操作、悲观锁、乐观锁及ABA问题。 原子操...

  • CAS ABA问题

    java.util.concurrent包的最底层基础CAS技术,原理很简单。 CAS有3个操作数,内存值V,旧的...

  • 并发和Read-copy update(RCU)

    简介 在上一篇文章中的并发和ABA问题的介绍中,我们提到了要解决ABA中的memory reclamation问题...

  • Java多线程22 Atomic

    ABA问题 输出true 解决 添加版本号

  • JUC之ABA问题

    什么是ABA问题? ABA问题是由CAS而导致的一个问题 CAS算法实现一个重要前提需要取出内存中某时刻的数据并在...

  • CAS中的ABA问题

    补档CAS中的ABA问题。 要特别注意,常见的ABA问题有两种,要求能分别举例解释。 CAS的使用可参考:源码|并...

  • lock-free ABA问题重现

    在多线程编程中,同步时会发生ABA问题。上述代码就是重现ABA问题,当一个地址需要被read2次,这个值没有改变意...

网友评论

      本文标题:ABA问题

      本文链接:https://www.haomeiwen.com/subject/mbtrvqtx.html