多线程进阶JUC之CAS初入

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();
    }
}

猜你喜欢

转载自blog.csdn.net/m0_47119598/article/details/113795223