JAVA cas 参数_加餐:JAVA CAS技术讲解,读完对CAS知识点了然于胸

前面提到过cas无锁并发机制,因为感觉这个知识点相对比较易懂,而且不像volatile与内存屏障那样经常被提及,所以并没有深入讲解,但考虑到专栏知识体系的完整性,将这一部分知识点补充上;

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开发者而言,实际调用的是下面的方法,参数含义一目了然:

public final boolean compareAndSet(V expect, V update) {return unsafe.compareAndSwapObject(this, valueOffset, expect, update);}

JAVA提供了如下类型数据,支持CAS操作,详见上一章节:

AtomicBooleanAtomicIntegerAtomicLongAtomicReferenceAtomicIntegerArrayAtomicLongArrayAtomicReferenceArray注意:

java中的数组类的CAS,仅仅支持数组中单个元素的CAS,并不支持整个数组CAS操作;java中引用类型的CAS,比较的是对象的地址,而不是equalsjava中的CAS操作可以保证可见性,因为其真实数据类型在声明时使用了volatile关键字。关于CAS的ABA问题

java提供的AtomicStampedReference类,通过使用版本号(时间戳)的方式来解决。

9881562e47a41b66c05b197f85959fa9.pngCAS

感谢阅读,关于CAS,还有其他的疑问吗?欢迎留言评论,我们一起学习探讨~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值