CAS无锁自旋

CAS:Compare and Swap    比较并且交换
日常编码过程中,基本不会直接用到 CAS 操作,都是通过一些JDK 封装好的并发工具类来使用的,在 java.util.concurrent 包下


CAS是一种无锁算法,它的功能是判断内存某个位置的值是否为预期值,如果是则改为新值,
否则重新循环去执行这个操作(自旋),或者什么都不做,这个过程是原子的

在volatile int i = 0; i++中,volatile类型的读写是原子同步的,但是i++却不能保证同步性,我们该怎么呢?
可以使用synchronized加锁;还有就是用CAS(比较并交换),使用乐观锁的思想同步,先判断共享变量是否改变,没有则更新
好比Atomic开头的一些类(原子的),都是用cas这种操作来保证线程安全的

AtomicInteger.incrementAndGet的实现用了乐观锁技术,调用了类sun.misc.Unsafe库里面的 CAS算法,
用CPU指令来实现无锁自增。所以,AtomicInteger.incrementAndGet的自增比用synchronized的锁效率倍增


AtomicInteger count = new AtomicInteger(0); //int count = 0;
void m(){
    for(int i =0; i <1000; i++){
        count.incrementAndGet(); //count++
    }
}


Compare And Set  比较并且设定
cas 某些地方可以代替synchronized ,他就是一个方法,这个方法有三个参数
cas(要改的值/Object(V),期望当前的值会是几(E),要设定的新值(New))      :期望值就是在执行cas操作前get到的要改的值
if V==E
V=New
如果期望值不是当前值,说明有其他线程更改了这些值,他会修改期望值再尝试一次cas操作,或者fail失败
cas有cpu的原语支持,所以他在执行的过程中不会被别的操作打断


cas(期望值,更新值)
m=0
m++

expected = red m;
cas(0,1){
    for(;;) 如果当前m值==0
        m=1
}
什么是ABA问题:
在CAS操作中将判断“V的值是否仍然为A?”,并且如果是的话就继续执行更新操作,在某些算法中,
如果V的值首先由A变为B,再由B变为A,那么CAS将会操作成功
java里提供了两个类来解决ABA问题 加一个时间戳 解决
如果是基础类型,无所谓
引用类型 ,你跟你的前女友复合,你前女友中间经历了N个男人

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值