什么是CASCAS即Compare And Swap的缩写,翻译成中文就是比较并交换,其作用是让CPU比较内存中某个值是否和预期的值相同,如果相同则将这个值更新为新值,不相同则不做更新,也就是CAS是原子性的操作(读和写两者同时具有原子性),其实现方式是通过借助C/C++调用CPU指令完成的,所以效率很高 。
CAS的原理很简单,这里使用一段JAVA代码来描述
public boolean compareAndSwap(int value, int expect, int update) {//如果内存中的值value和期望值expect一样 则将值更新为新值updateif (value =https://www.isolves.com/it/cxkf/bk/2021-10-09/= expect) {value = update;return true;} else {return false;}}
大致过程是将内存中的值、我们的期望值、新值交给CPU进行运算,如果内存中的值和我们的期望值相同则将值更新为新值,否则不做任何操作 。这个过程是在CPU中完成的,这里不好描述CPU的工作过程,就拿Java代码来描述了 。
Unsafe源码分析Java是在Unsafe(sun.misc.Unsafe)类实现CAS的操作,而我们知道Java是无法直接访问操作系统底层的API的(原因是Java的跨平台性限制了Java不能和操作系统耦合),所以Java并没有在Unsafe类直接实现CAS的操作,而是通过JDI(Java Native Interface) 本地调用C/C++语言来实现CAS操作的 。
Unsafe有很多个CAS操作的相关方法,这里举例几个
public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);
我们拿public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);进行分析,这个方法是比较内存中的一个值(整型)和我们的期望值(var4)是否一样,如果一样则将内存中的这个值更新为var5,参数中的var1是值所在的对象,var2是值在对象(var1)中的内存偏移量,参数var1和参数var2是为了定位出值所在内存的地址 。
文章插图
Unsafe.java 在这里发挥的作用有:
- 将对象引用、值在对象中的偏移量、期望的值和欲更新的新值传递给Unsafe.cpp
- 如果值更新成功则返回true给开发者,没有更新则返回false
- 接受从Unsafe传递过来的对象引用、偏移量、期望的值和欲更新的新值,根据对象引用和偏移量计算出值的地址,然后将值的地址、期望的值、欲更新的新值传递给CPU
- 如果值更新成功则返回true给Unsafe.java,没有更新则返回false
- 接受从Unsafe.cpp传递过来的地址、期望的值和欲更新的新值,执行指令cmpxchg,比较地址中的值是否和期望的值一样,一样则将值更新为新的值,不一样则不做任何操作
- 将操作结果返回给Unsafe.cpp
ABA问题在多线程场景下CAS会出现ABA问题,关于ABA问题这里简单科普下,例如有2个线程同时对同一个值(初始值为A)进行CAS操作,这三个线程如下
- 线程1,期望值为A,欲更新的值为B
- 线程2,期望值为A,欲更新的值为B
ABA问题带来的危害:
小明在提款机,提取了50元,因为提款机问题,有两个线程,同时把余额从100变为50
线程1(提款机):获取当前值100,期望更新为50,
线程2(提款机):获取当前值100,期望更新为50,
线程1成功执行,线程2某种原因block了,这时,某人给小明汇款50
线程3(默认):获取当前值50,期望更新为100,
这时候线程3成功执行,余额变为100,
线程2从Block中恢复,获取到的也是100,compare之后,继续更新余额为50!!!
此时可以看到,实际余额应该为100(100-50+50),但是实际上变为了50(100-50+50-50)这就是ABA问题带来的成功提交 。
推荐阅读
- 沼气发电原理及特点介绍
- 折扇收藏价值分析
- 衬衫|DNF:1天满级预约,选择哪个职业?从110级的视角全面分析
- 草坪种植方法的分析与介绍
- Tomcat 整体架构分析
- led电子显示屏的工作原理和功能
- 亚马逊选品常见误区?亚马逊选品原则
- 红木手镯系列市场分析
- 路由负载转发原理实验
- 教你一个月把网站做到首页前20名,附带分析网站没排名的因素