CAS

CompareAndSet===>CAS 比较并交换

CAS是什么:
全称为CompareAndSet,是一条CPU并发原语。它的功能是判断内存中某个位置的值是否是期望值,是的话更改为新的值,这个过程是原子性的。
CAS并发原语体现在JAVA语言中就是sun.misc.unsafe类中的各个方法中。调用Unsafe类中的cas方法,JVM会帮我们实现出CAS汇编指令。
这是一种完全依赖于硬件的功能,通过它实现了原子操作,再次强调,由于CAS是一种系统原语,原语属于操作系统用于范畴,是由若干条指令组成,
用于完成某个功能,且原语执行必须是连续的,在执行过程中不允许中断,CAS是一条CPU的原子指令,不会造成所谓的数据不一致。
比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,否则继续比较直到主内存和工作内存中的值一直为止。
CAS应用:有3个操作数,内存值V,就得预期值A,要修改的新值B,当预期值A和内存值V相同时,将内存值V改为B,,否则什么都不做。


CAS底层原理:自旋锁&unsafe


1、Unsafe是CAS的核心类,由于java方法无法直接访问底层系统,需要通过本地native方法来访问,unsafe相当于一个后门,基于该类可以直接操作特定内存的数据。
unsafe类存在于sun.misc包中,其内部方法操作可以像C的指针一样直接操作内存,因为Java的CAS操作的执行依赖于unsafe类的方法
注意:unsafe类中的所有方法都是native修饰的,也就是说该类的方法都是直接调用操作系统底层资源执行任务的
2、valueOffset内存地址偏移量,因为unsafe就是根据valueOffset获取数据的

3、变量value是用volatile修饰的,保证了多线程之间的内存可见性

CAS的缺点:
1、循环时间长,CPU开销大
2、只能保证一个共享变量的原子操作
3、ABA问题

原文地址:https://www.cnblogs.com/wangyingshuo/p/14116723.html