一、CAS基本原理
1、Unsafe类
(1)概念及作用:增强Java语言操作底层资源的能力,里面的方法多为native修饰的方法(基于C++实现),不建议在代码中使用,不安全。
(2)底层原理:Unsafe类提供的CAS方法,直接通过native方式(通过指针直接操作内存),调用了底层的CPU指令cmpxchg(原子指令)。
(3)使用:类被final修饰,构造方法是私有的,因此不能外部实例化,只能通过反射调用。
Field theUnsafe=Unsafe.class.getDeclaredField("theUnsafe");
//private static final Unsafe theUnsafe;
2、CAS
(1)比较并交换 CompareAndSwap
CAS(字段内存位置,预期值,新值)
取出内存位置的值,与预期值比较,若相同则设置为新值
do{
获得字段的预期值(oldValue)
计算出需要替换的新值(newValue)
}while(!CAS(内存地址,oldValue,newValue))
//注意oldValue的值在不断的更新
二、JUC原子类
(1)AtomicXXX
具体例子:
JUC并发编程DAY08-CSDN博客
(2)存在的问题:
ABA问题
1线程操作变量A,2线程修改为B,在1线程发现前又修改为A。
三、LongAdder
以空间换时间、热点分离
将value值分离成一个数组,获取最终的value时,则将数组的元素求和。