前面提到过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类,通过使用版本号(时间戳)的方式来解决。
CAS
感谢阅读,关于CAS,还有其他的疑问吗?欢迎留言评论,我们一起学习探讨~