CAS:compareAndSet,比较当前工作内存中的值和主内存中的值,如果这个值是期望的,那么则执行操作!如果不是就一直循环下去,使用的是自旋锁
缺点:
- 循环会耗时
- 一次性只能保证一个共享变量的原子性
- 它会存在ABA问题
什么是ABA问题?
狸猫换太子:线程A和线程B;主内存中a=1;A和B期望的都是a=1,两个线程也拿到了a=1到自己的工作内存中,这时候,A修改了a=3,然后又把a=3修改为a=1并同步到主内存中,这时候B并不知道这个值是修改过的,这就是ABA问题
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(2020);
System.out.println(atomicInteger.compareAndSet(2020, 2021));
System.out.println(atomicInteger.get());
//boolean compareAndSet(int expect, int update)
//期望值、更新值
//如果实际值 和 我的期望值相同,那么就更新
//如果实际值 和 我的期望值不同,那么就不更新
System.out.println(atomicInteger.compareAndSet(2021, 2020));
System.out.println(atomicInteger.get());
//因为期望值是2020 实际值却变成了2021 所以会修改失败
//CAS 是CPU的并发原语
// atomicInteger.getAndIncrement(); //++操作
System.out.println(atomicInteger.compareAndSet(2020, 2021));
System.out.println(atomicInteger.get());
}
保证原子性 ,使用AtomicStampedReference类
//一般使用这个方法,加入一个时间戳,作用相当于乐观锁
public AtomicStampedReference(V initialRef, int initialStamp) {
pair = Pair.of(initialRef, initialStamp);
}