CAS算法

作者: 倦飞知还 | 来源:发表于2018-03-08 15:29 被阅读0次

    一、算法

    CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

    CAS比较与交换的伪代码可以表示为:

    do{

    备份旧数据;

    基于旧数据构造新数据;

    }while(!CAS( 内存地址,备份的旧数据,新数据 ))
    例如AtomicInteger中的增加代码

       public final int getAndAccumulate(int x,
                                         IntBinaryOperator accumulatorFunction) {
           int prev, next;
           do {
               prev = get();
               next = accumulatorFunction.applyAsInt(prev, x);
           } while (!compareAndSet(prev, next));
           return prev;
       }
    

    其中比较的代码为

       private static final sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe();
       public final boolean compareAndSet(int expect, int update) {
           return U.compareAndSwapInt(this, VALUE, expect, update);
       }
    
    

    U.compareAndSwapInt实现的是cpu指令级别的操作

    二、比较

    • 与悲观锁相比,大大提高了效率,悲观锁的挂起需要上下文的切换,消耗资源很大。
    • 不能完全阻止脏读的产生,如果在“比较后交互”之前发生了数据变化,后来又恢复了数据变化,但是整个过程对其它数据产生了影响,就会产生脏读。

    相关文章

      网友评论

          本文标题:CAS算法

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