根据b站UP主狂神说JUC课程所写的个人学习笔记 视频地址:https://www.bilibili.com/video/BV1B7411L7tE?from=search&seid=14761503393031794075
解决aba问题,引入原子引用
带版本号的原子操作
public class CASDemo { //cas 比较并交换 //Integer public static void main(String[] args) { // AtomicInteger atomicInteger = new AtomicInteger(2020); AtomicStampedReference<Integer> atomicInteger = new AtomicStampedReference<>(1,1); //对于我们平时写的sql:乐观锁 // public final boolean compareAndSet(int expectedValue, int newValue) //如果期望的值达到了就更新,否则就不更新 new Thread(()->{ int stamp = atomicInteger.getStamp();//获得版本号 System.out.println("a1"+atomicInteger.getStamp()); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } atomicInteger.compareAndSet(1,2,atomicInteger.getStamp(),atomicInteger.getStamp()+1); System.out.println("a2"+atomicInteger.getStamp()); atomicInteger.compareAndSet(2,1,atomicInteger.getStamp(),atomicInteger.getStamp()+1); System.out.println("a3"+atomicInteger.getStamp()); },"a").start(); new Thread(()->{ int stamp = atomicInteger.getStamp();//获得版本号 System.out.println("b1"+atomicInteger.getStamp()); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } atomicInteger.compareAndSet(1,6,stamp,stamp+1); System.out.println("b2"+atomicInteger.getStamp()); },"a").start(); } }