JUC之CAS
CAS是 compare and swap的缩写,中文翻译成比较并交换,实现并发算法时常用到的一种技术
它包含三个操作数——内存位置、预期原值及更新值,执行CAS操作的时候,将内存位置的值与预期原值比较,如果相匹配,那么处理器会自动将该位置值更新为新值,如果不匹配,处理器不做任何操作,多个线程同时执行CAS操作只有一个会成功
UnSafe
Unsafe 是CAS的核心类,由于Java方法无法直接访问底层系统,需要通过本地(native)方法来访问,Unsafe相当于一个后门,基于该类可以直接操作特定内存的数据
Unsafe 类存在于 sun.misc 包中,其内部方法操作可以像C的指针一样直接操作内存,因为 Java 中 CAS 操作的执行依赖于 Unsafe 类的方法
注意 Unsafe 类中的所有方法都是 native 修饰的,也就是说 Unsafe 类中的方法都直接调用操作系统底层资源执行相应任务
变量 valueOffset,表示该变量值在内存中的偏移地址,因为 Unsafe 就是根据内存偏移地址获取数据的
变量 value 用 volatile 修饰,保证了多线程之间的内存可见性
CAS 缺点
循环时间长开销很大
ABA问题