Java中的CAS

CAS关键字

CAS介绍

CAS是compareAndSwap(比较并交换),它有三个操作数,分别是内存地址V,旧的预期值A,新的值B,CAS执行时,当且仅当V的值符合旧预期值A时,处理器就更新V的值为B,否则就不进行更新。无论它是否更新V的值,都会返回V的旧值,这是个原子操作。

​ CAS实现了无锁状态下的共享变量的非原子操作问题。这是基于处理器的机制,在Java中在sun.misc.Unsafe类中的compareAndSwapInt()和compareAndSwapLong等几个方法包装提供。

​ Unsafe类不是提供给用户调用的类,设置不是启动类加载器加载的class无法访问它,除了利用反射,就是在JUC包下的整数原子类如AtomicInteger的compareAndSet和getAndIncrement()方法都使用了Unsafe类的CAS操作。

CAS的ABA问题

一个变量初始值为A,准备赋值时检测为A,这时候可能这个变量曾经改成了B,然后又被改回了A。这样虽然旧值没改变,但是实际上已经改变了。

JUC提供了AtomicStampedReference来解决这个问题,给变量加上版本号。

CAS的缺陷

一般使用CAS时,处理器会循环一直执行CAS操作,如果一直不执行成功,就一直等待下去。在很多线程同时想更新一个变量时,CAS会给CPU带来很大的压力。这时候使用传统的同步比较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值