CAS(Compare And Swap)问题

CAS是乐观锁中用到的机制(java中通过循环CAS的方式来实现原子操作)

CAS操作原理
  • CAS是一种无锁算法
  • CAS 有 3 个操作数,内存值 V,旧的预期值 A,要修改的新值 B。当且仅当预期值 A 和内存值 V相等时,将内存值V修改为B,否则重新读取内存值V,循化前一步的操作.
  • CAS采用的是一种非阻塞算法,一个线程的失败或者挂起,不会影响另一个线程的失败或挂起.
通过CAS操作来实现+1操作的,下面getAndIncrememt()方法就是
    public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}
//这里采用CAS操作,每次从内存中读取到数据后将此数据+1后的结果复制给current,
//如果成功就返回结果,否则重试直至成功为止;
  • CAS劣势:
    1、自旋时间长开销大;
    2、只能保证一个共享变量的原子操作;
    3、ABA问题(线程1将A–>B,线程2将A–>C–>A)
    CAS算法实现一个重要前提需要提取出内存中某时刻的数据,而在下时刻比较替换,那么在这个时间差类会导致数据的改变
ABA问题

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

  • ABA问题的解决
    加上版本号(进行更新操作)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值