Java中CAS操作

定义

CAS:Compare and Swap

其中在java中使用CAS底层借助 Unsafe 来操作,实现非阻塞的修改变量值,CAS是使用了硬件指令保证原子性
每次进行compareAndSwap方法时,需要cas有3个参数
内存地址V
旧的预期值E
要修改的新值N

  • E == V 时,修改 V 值为 N,返回true
  • E != V 时,修改失败,返回false

AtomicBoolean,AtomicInteger,AtomicLong 等都是使用CAS来实现的。但是没有解决ABA问题。

什么是ABA问题

一个线程获取值为a,另一个线程将数值由a改成了b,接着又改成了a,此时线程b的CAS操作认为是没有变化,但其实已经变化过了,这种过程就叫ABA问题。

CAS的ABA问题解决

可以使用版本号标志,每当修改操作一次版本号加1,这样比较时候,不管比较值还比较了版本号。但是在java5中,已经提供了AtomicStampedReference

import java.util.concurrent.atomic.AtomicStampedReference;

public class Test {
    private static AtomicStampedReference atomicStampedReference = new AtomicStampedReference(100, 0);
    public static void main(String[] args) {
        while (!incr()) {
        }
    }
    private static boolean incr() {
        int stamp = atomicStampedReference.getStamp();
        return atomicStampedReference.compareAndSet(100, 101, stamp, stamp + 1);
    }
}

CAS缺点

  1. 循环时间长,开销很大:就是如果CAS失效,就会一直进行尝试,当时间过长仍然失败,那么就会给CPU带来很大的开销
  2. 不能保证代码块的原子性,只能保证变量的原子性操作
  3. ABA问题
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值