什么是CAS

--什么是CAS:全称是Compare and Swap,(比较并交换的意思)

       1.  cas是一种原子操作,他是一种系统源语,是一条CPU的原子指令,从CPU层面保证他的原子性:cas是一种基于锁的操作,而且是乐观锁悲观锁是将资源锁住,等下一个之前获得锁的线程释放锁之后,下一个线程才可以访问,而乐观锁采用了一种宽容的态度,通过某种方式不加锁来处理资源,比如通过给记录加verson版本号+1来获取数据,性能较悲观锁有很多大的提高!

    2.    cas操作包含三个操作数:V-内存位置(var),A-预期原值(expected本质上是旧值)B-新值(new)。如果内存位置(V)的值和(A)相同,那么就将内存中的值(V)更新成新值(B)。cas是通过无限循环来获取 数据的,如果在第一轮循环中,T1线程获取地址中的值被T2线程修改了,那么T1线程需要自旋,到下次循环才有可能机会执行!

举个栗子有一个多线程共享的变量var等于1,线程A想设置var为2。使用CAS实现

首先var与1对比,发现它等于1,说明var没有被别的线程更改过,那就把var设置为新的值2,此次CAS成功,var的值就设置成了2

如果对比发现不等于1,说明var被其它线程更改过了(比如var是3了),就什么也不做,此次CAS失败,var的值还是3

  3.   cas的实现原理:在java中有一个Unsafe类。里面都是一些native方法就是cas的,(java中如果一个方法是native的,那么java就不负责

具体实现它,而是交给底层jvm使用c或者c++去实现。java.util.concurrent.atomic包下类大多是使用cas操作来实现的(Atomiclnteger,AtomicBoolean,AtomicLong)

      4. cas的作用:可以使用循环cas实现原子操作,利用了处理器提供的CMPXCHG指令实现的,自旋CAS实现的基本思路就是循环进行cas操作直到成功为止。

      5.cas的问题:

         1)cas容易造成ABA问题: 一个线程T1将数值修改成b,接着又改成了a,此时cas认为是没有变化的,其实是已经变化过了,而这个问题的解决方案可以使用版本标识或者时间戳,每次变量更新的时候把版本号加1,那么ABA,就会变成1A>2B>3A

         2) 不能保证代码块的原子性:cas机制所保证的支持一个变量的原子性操作,而不能保证整个代码块的原子性,比如需要保证3个变量共同进行原子性的更新,就不得不使用synchronized了

       3)cas造成cpu利用率增加: cas多与自旋结合,如果自旋cas长时间不成功会占用大量的cpu资源,可以让jvm支持处理器提供pause指令,效率会有一定的提升pause指令能让自旋失败是cpu睡眠一小段时间在继续自旋,从而使得读操作的频繁率低很多,为解决内存顺序冲突而导致CPU流水线重排的代价也会很小很多。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值