java 的CAS

CAS:什么是 CAS 机制?
cas目的是实现原子操做解释一下:
"原子操做(atomic operation)是不须要synchronized",这是多线程编程的老生常谈了。所谓原子操做是指不会被线程调度机制打断的操做;这种操做一旦开始,就一直运行到结束,中间不会有任何 context switch (切 [1] 换到另外一个线程)。 这是百度百科的解释
意思就是这个状态不会被中间态打断,例如银行转帐机制,一个帐号扣钱了,收钱帐户也必定要收钱,不能中断
在java中原子操做 用于多线程的操做场景避免一个共享变量没有达到预期值java

参见一个例子不安全场景:数据库

  

这个结果 count不必定是200,由于存在多线程的竞争问题可能小于200,若是把run方法里面 加上synchronized代码块后每一个线程的运行的状态不会受别的线程影响,实现了原子操做,最中结果必定是200.  编程

java.util.concurrent.atomic包下 有一系列原子类安全

 

这中操做最后也是200,由于原子类专门解决了这个问题多线程

java.util.concurrent.atomic 包下的类就是解决CAS的问题的,都是原子类。并发

原子类中的value 利用了volatile 实现的变量值共享。高并发

,核心原理是:CAS机制当中使用了3个基本操做数:内存地址V,旧的预期值A,要修改的新值B。性能

每次更新的时候旧值都要与内存值比较,不一致会更新失败,而后利用内存值继续更新(出现了自旋操做,在高并发下比较危险会严重消耗cpu资源)atom

好比第二个线程运行到97的时候 第一个线程因为反应较慢才运行到5那么当5自增的时候必定会失败内存值与旧值不一致,因此进行自旋从97开始到98,第二个线程开始运行98旧值是97因此也会失败开始自旋到98,以此类推就实现了交替自增最终结果是200..net

参见:https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_jpg/NtO5sialJZGpfMM4tNG7D3k05o337rpShibke60ZSQ8jQuoQMdXK7fcyLkkDGS2EfOiahzQQS9DPHmjsXcB8ibWKdg/0?wx_fmt=jpeg

图文并茂的讲解。

cas是乐观锁,synchronized 是悲观锁,  在大并发下synchronized 的使用要比cas好些(CAS自旋的几率会比较大,从而浪费更多的CPU资),并发不大的时候cas性能好(不须要切换线程,操做自旋概率较少)

cas存在的问题:

ABA问题,若是 一个值是A, 被线程2变成了B, 被线程2或者其它的线程又给变回了A, 那么此时线程1操做的时候检查到的仍是A,就认为没有变化,则执行更新,

AtomicStampedReference类解决了该问题,加入了版本号的解决方式。相似数据库的乐观锁加入版本号机制。

只能保证一个共享变量的原子操做,AtomicReference类可以知足多个变量的原子操做。

相关文章
相关标签/搜索