java无锁_java进阶:无锁并发编程利器 CAS讲解

大家好,这里是IT技术百货,专注于有价值的IT技术知识分享;今天跟大家分享JAVA中的CAS机制

CAS是什么

CAS是compare and swap的缩写,大概意思是将读取、比较、交换这三个指令组成一个原子操作,当读取到的值跟预期的值一致,就交换;不一致就不交换。

CAS并不是JAVA语言特有的,而是操作系统或者是CPU控制器提供的指令,不同的操作系统,不同的CPU可能会有差异。比如:交换成功,有的可能会返回true,有的可能会返回交换之后的新值;

经典的使用方式如下:

读取内存中的值X,值为v1对X经过一系列的处理,得到结果v2使用CAS机制替换内存中的值,如果内存中的值是v1,则替换为v2;否则不替换。JAVA语言中的CAS

JAVA语言中的CAS操作是通过调用底层的方法来实现的;通过阅读java源码,可以看到,CAS操作最终调用的native方法。

public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);

JAVA提供了如下类型数据,支持CAS操作:

AtomicBooleanAtomicIntegerAtomicLongAtomicReferenceAtomicIntegerArrayAtomicLongArrayAtomicReferenceArray特别说明的是AtomicReference的比较,比较的是内存地址,而不是equals;

CAS的优势

CAS不需要加锁,一般来讲性能会更好一些;

CAS的问题

通过源码可以看到,CAS操作如果比较失败,会循环等待,并且不会释放CPU,这时候开销可能会比较大;

6b8a0004b11a20ecb42f35471c1f3760.png

CAS中的ABA问题

针对CAS中的ABA问题,一般是通过给为字段设置版本号来解决;

或者是设置最后一次更新的时间戳(类似于加版本号)

f52c2d6c4625d46c0464bd765c8992f6.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值