> 文档中心 > CAS性能虽好, 但存在的ABA问题你知道吗

CAS性能虽好, 但存在的ABA问题你知道吗

一、解释下什么是CAS

二、CAS性能虽好, 但存在的ABA问题你知道吗

一、解释下什么是CAS

全称是Compare And Swap,即比较再交换,是实现并发应用到的一种技术
底层通过Unsafe类实现原子性操作操作包含三个操作数 —— 内存地址(V)、预期原值(A)和新值(B)。 
如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 ,若果在第一轮循环中,a线程获取地址里面的值被b线程修改了,那么a线程需要自旋,到下次循环才有可能机会执行。

CAS这个是属于乐观锁,性能较悲观锁有很大的提高
AtomicXXX 等原子类底层就是CAS实现,一定程度比synchonized好,因为后者是悲观锁

二、CAS性能虽好, 但存在的ABA问题你知道吗

CAS会存在什么比较严重的问题?
1、自旋时间长CPU利用率增加,CAS里面是一个循环判断的过程,如果线程一直没有获取到状态,cpu资源会一直被占用
​2、存在ABA问题  

什么是ABA问题?

如果一个变量V初次读取是A值,并且在准备赋值的时候也是A值,那就能说明A值没有被修改过吗?其实是不能的,因为变量V可能被其他线程改回A值,结果就是会导致CAS操作误认为从来没被修改过,从而赋值给V
​怎么避免这个问题呢?
        给变量加一个版本号即可,在比较的时候不仅要比较当前变量的值 还需要比较当前变量的版本号
在java5中,已经提供了AtomicStampedReference来解决问题,检查当前引用是否等于预期引用,其次检查当前标志是否等于预期标志,如果都相等就会以原子的方式将引用和标志都设置为新值