什么是CAS
java
package com.mystpet.CASTest;
import java.util.concurrent.atomic.AtomicInteger;
// CAS compareAndSet:比较并交换
public class CASDemo {
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(200);
// 期望、更新
// public final boolean compareAndSet(int expect, int update)
// 如果我的期望值达到了,那么就会更新,否则,就不更新, CAS 是CPU的并发原语!
System.out.println(atomicInteger.compareAndSet(2020,2021));
System.out.println(atomicInteger.get());
System.out.println(atomicInteger.compareAndSet(2021,2020));
System.out.println(atomicInteger.get());
}
}Unsafe类



CAS : 比较当前工作内存中的值和主内存中的值,如果这个值是期望的,那么则执行操作!如果不是就一直循环!
缺点:
1、 循环会耗时
2、一次性只能保证一个共享变量的原子性
3、ABA问题
CAS:ABA问题

例子:
java
package com.mystpet.CASTest;
import java.util.concurrent.atomic.AtomicInteger;
public class CASDemo {
// CAS compareAndSet:比较并交换
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(2020);
// 期望、更新
// public final boolean compareAndSet(int expect, int update)
// 如果我的期望值达到了,那么就会更新,否则,就不更新, CAS 是CPU的并发原语!
// ============== 捣乱的线程 ================== System.out.println(atomicInteger.compareAndSet(2020, 2021));
System.out.println(atomicInteger.get());
System.out.println(atomicInteger.compareAndSet(2021, 2020));
System.out.println(atomicInteger.get());
// ============== 期望的线程 ================== System.out.println(atomicInteger.compareAndSet(2020, 6666));
System.out.println(atomicInteger.get());
}
}总结:2020->2021->2020 明明被换过但系统只认数值