CAS
/**
* CAS是CPU的并发原语
* ABA问题
*
* @Author Weton Li
* @Date 2021/2/12 15:22
*/
public class CASdemo {
public static void main(String[] args) {
// public final boolean compareAndSet(int expect, int update) { 期望,更新
// return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
// }
// AtomicInteger atomicInteger = new AtomicInteger(2020);
// 如果期望的值达到了,就更新,否则就不更新。
// 捣乱的线程
System.out.println(atomicInteger.compareAndSet(2020, 2021));// true,比较并交换
System.out.println(atomicInteger.get()); // 2021
System.out.println(atomicInteger.compareAndSet(2021, 2020));//
System.out.println(atomicInteger.get()); // 2021
// atomicInteger.getAndIncrement();
// 期望的线程
System.out.println(atomicInteger.compareAndSet(2020, 6666)); // false
System.out.println(atomicInteger.get()); // 2021
}
}
原子引用
public class CASdemo {
public static void main(String[] args) {
// 原子引用
AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<>(2,1);
new Thread(()->{
int stamp = atomicStampedReference.getStamp(); // 获取版本号
System.out.println(stamp);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(atomicStampedReference.compareAndSet(2, 4, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1));
System.out.println("a2->"+stamp);
System.out.println(atomicStampedReference.compareAndSet(4, 2, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1));
System.out.println("a3->"+stamp);
},"a").start();
new Thread(()->{
int stamp = atomicStampedReference.getStamp(); // 获取版本号
System.out.println(stamp);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(atomicStampedReference.compareAndSet(2, 6, stamp, stamp + 1));
System.out.println("b1->"+atomicStampedReference.getStamp());
},"a").start();
}
}