它是一条CPU并发原语。它的功能时判断内存的某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。
首先呢第一他是通过自旋锁来实现的
第二个就是unsafe类
Unsafe是CAS的核心类,因为Java方法无法直接访问底层系统,而是通过本地(native)方法来访问,Unsafe类中的所有方法都是native修饰的,它所有方法都可以直接调用操作系统。
unsafe就是根据内存偏移地址获取数据的,而他的变量值是用volatile修饰的,这样就保证了可见性。
先取到主物理内存的值,然后在比较看主物理内存的值与期望值是否一致,如果一致就进行修改并返回给主物理内存,如果不一致,再一次进行循环,直到修改成功。
缺点是:
1.如果CAS失败,会一直进行尝试,如果CAS长时间不成功,可能给CPU带来很大的开销循环时间长,开销大
2.对多个共享变量操作时,循环CAS无法保证操作的原子性,这个时候就可以用锁来保证原子性
3.引出ABA问题
线程1将主物理内存的值A修改为了B,然后又修改成了A,此时线程2拿到了值A,但这个值已经被线程1改动过了,但值还是原来的值,虽然它还是原来的值,但已经不是初始的A,此时线程2进行修改,并且修改成功,可能导致错误,这就是aba问题
ABA问题导致的原因,是CAS过程中只简单进行了“值”的校验,有些情况下,“值”虽然相同,却已经不是原来的数据了。
解决方案:加版本号,即使值一样,再比对版本号是否一致,如果一致修改成功,如果不一致修改失败