美文网首页
CAS与ABA问题

CAS与ABA问题

作者: 睦月MTK | 来源:发表于2020-05-08 11:57 被阅读0次

声明:不足之处,请指正


一、CAS与ABA
  • CAS
    CAS就是"compare and set",意味比对旧值,如果旧值符合预期则更新为新值
  • ABA
    ABA不能说是CAS的缺陷,应该说CAS在大部分的应用场景并不严谨,然后才会导致ABA问题。目前大部分CAS的应用场景都是为了判别一个变量是否被其他线程动过,如果变量的值符合预期,则判断变量没有被动过,故可以进行新值的更新。但是变量的值符合预期不能真正说明变量没有被变更过。也许,预期的A值是其他线程经过一系列操作之后的才出现的。所以说,如果你可以保证变量的值符合预期,我就可以给其更新新的值,那么ABA并不是问题,比如该值永远都不会重复,那么也不存在ABA问题了。如果不能保证这一点,就需要去解决ABA问题。

二、ABA的解决方法
  • ABA的解决思路
    既然无法确定即使旧值符合预期,变量是否依然被变更过,那么就给这个变量添加一个版本,版本值一定不能重复使用,不然又会出现ABA问题。如果版本变动过,那么说明该值是不可信的。
  • 解决ABA的类AtomicStampedReference
//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问题

相关文章

  • CAS与ABA问题

    声明:不足之处,请指正 一、CAS与ABA CASCAS就是"compare and set",意味比对旧值,如果...

  • 原子操作 CAS CompareAndSwap

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

  • CAS中的ABA问题

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

  • CAS ABA问题

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

  • JUC之ABA问题

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

  • 1.2.3JAVA锁相关

    ABA问题 在两个线程同时对一个资源进行CAS的时候,会导致ABA问题,就是在线程A进行了一次CAS,这个时候线程...

  • 细谈CAS与ABA

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

  • CAS和ABA问题

    @[toc] 一、什么是CAS (Compare And Swap) ? 在多线程环境下执行"check and ...

  • CAS 的ABA问题

    关于CAS操作有个经典的ABA问题,具体如下:假如线程I使用CAS修改初始值为A的变量X,那么线程I会首先去获取当...

  • 《32个Java面试必考点》学习笔记之五------并发与多线程

    并发与多线程知识点汇总知识点详解线程的状态转换CAS与ABA问题Synchronized实现原理AQS与Lock线...

网友评论

      本文标题:CAS与ABA问题

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