大家好,这里是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,这时候开销可能会比较大;
CAS中的ABA问题
针对CAS中的ABA问题,一般是通过给为字段设置版本号来解决;
或者是设置最后一次更新的时间戳(类似于加版本号)