Java中的CAS(Compare And Swap)

CAS是compareAndSwap的简称,它可以帮助我们实现多线程执行的安全性。

CAS有三个操作数:内存值V、旧的预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做并返回false。虽然步骤分为两笔,比较和赋值,但CAS是在native层的unsafe类中实现的,属于硬件级别的操作,同样可以保证原子性。


下面是compareAndSwapInt方法:

public final native boolean compareAndSwapInt(Object paramObject, long paramLong, int paramInt1, int paramInt2);
第一个参数Object是要修改的对象,第二个参数是要修改的变量在存储Object的内存中偏移量,通过这两个参数定位要修改的变量,第三个参数是修改之前的值,第四个参数是预期修改之后的值。

java.util.concurrent包中的atomic就是使用CAS保证原子性的。

CAS缺点

CAS存在一个很明显的问题,即ABA问题。
如果变量V初次读取的时候是A,并且在准备赋值的时候检查到它仍然是A,那能说明它的值没有被其他线程修改过了吗?如果在这段期间它的值曾经被改成了B,然后又改回A,那CAS操作就会误认为它从来没有被修改过。针对这种情况,java并发包中提供了一个带有标记的原子引用类"AtomicStampedReference",它可以通过控制变量值的版本来保证CAS的正确性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值