CAS/ABA

作者: TUCJVXCB | 来源:发表于2019-08-10 22:37 被阅读0次

CAS:CompareAndSwap,是一种原子操作,用于在多线程环境中保证不被打断的数据交换操作,用旧值和主内存中的值做比较,如果相同则讲旧值替换成新值,Java中由sun.misc.UnSafe类实现CAS。


AtomicInteger这个类在多线程环境下是线程安全的,它的getAndIncrement()方法能够在多线程环境下安全地实现i++操作,以下是它的源码,它调用了UnSafe类的getAndAddInt方法。

    public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }
    public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;//定义一个新值
        do {
            var5 = this.getIntVolatile(var1, var2);//将val1对象在var2内存地址的值赋给var5
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));//这里的compareAndSwapInt方法是将var1对象在var2内存地址的值和var5比较,如果相同的话,var5设置为var5+var4,并且这个返回返回true,跳出循环。如果旧值var5和内存中的值不相同的话,则在while中一直循环,直至值相同为止

        return var5;
    }

CAS的缺点:

  • 如果旧值和内存中的值一直不相等,会一直循环,会给CPU带来很大的开销
  • CAS只能对一个共享变量保证原子操作,无法对多个共享变量保证原子操作
  • ABA问题

ABA

什么是ABA?假设有两个线程,分别叫T1和T2,T1和T2分别从主内存中拷贝一份变量,这个变量的值是A,T1和T2线程都要对变量A修改操作,T2先作出修改,根据CAS原则,变量A在主内存中的值还是A,所以A被修改成为B,紧接着T2线程又对B进行修改,把B改成A,T2线程完成任务,被挂起。然后T1线程修改变量的值,工作内存的值和主内存的值都是A,所以T1线程也可以修改这个变量,但是T1线程不知道该变量在它修改之前已经被修改过了。

那么如何解决ABA问题?

使用J.U.C包提供的AtomicStampedReference类,用版本号来控制CAS。

相关文章

  • CAS/ABA

    CAS:CompareAndSwap,是一种原子操作,用于在多线程环境中保证不被打断的数据交换操作,用旧值和主内存...

  • 原子操作 CAS CompareAndSwap

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

  • CAS中的ABA问题

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

  • JUC之ABA问题

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

  • 1.2.3JAVA锁相关

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

  • CAS和ABA

    CAS:对于内存中的某一个值V,提供一个旧值A和一个新值B。如果提供的旧值V和A相等就把B写入V。这个过程是原子性...

  • CAS和ABA

    独占锁(悲观锁)与乐观锁 在多线程编程的时候,为了保证多个线程对一个对象可以安全进行访问时,我们需要加同步锁syn...

  • CAS ABA问题

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

  • JMM内存模型,JVM分配策略,Volatile+AtomicX

    为了深入理解CAS的,我们从以下几个维度去探究CAS,然后再去考虑为什么出现ABA问题。 CAS是什么? 测试用例...

  • 细谈CAS与ABA

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

网友评论

      本文标题:CAS/ABA

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