并发编程核心点CAS

36 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

了解CAS不,能否解释下什么是CAS

全称是Compare And Swap,即比较再交换,是实现并发应用到的一种技术

CAS这个是属于乐观锁,性能较悲观锁有很大的提高

底层通过Unsafe类实现原子性操作操作包含三个操作数 —— 内存地址(V)、预期原值(A)和新值(B)。 

在这里插入图片描述

CAS会存在什么比较严重的问题?

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

能否解释下什么是ABA问题,怎么避免这个问题呢?

如果一个变量V初次读取是A值,并且在准备赋值的时候也是A值,那就能说明A值没有被修改过吗?其实是不能的,因为变量V可能被其他线程改回A值,结果就是会导致CAS操作误认为从来没被修改过,从而赋值给V

给变量加一个版本号即可,在比较的时候不仅要比较当前变量的值 还需要比较当前变量的版本号。
在java5中,已经提供了AtomicStampedReference来解决问题,检查当前引用是否等于预期引用,其次检查当前标志是否等于预期标志,如果都相等就会以原子的方式将引用和标志都设置为新值