Loading

并发编程之深入理解CAS

public class ABADemo {
private static AtomicReference atomicReference=new AtomicReference<>(100);
private static AtomicStampedReference stampedReference=new AtomicStampedReference<>(100,1);
public static void main(String[] args) {
System.out.println("=以下是ABA问题的产生=");
new Thread(()->{
atomicReference.compareAndSet(100,101);
atomicReference.compareAndSet(101,100);
},"t1").start();

    new Thread(()->{
        //先暂停1秒 保证完成ABA
        try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
        System.out.println(atomicReference.compareAndSet(100, 2019)+"\t"+atomicReference.get());
    },"t2").start();
    try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); }
    System.out.println("===以下是ABA问题的解决===");

    new Thread(()->{
        int stamp = stampedReference.getStamp();
        System.out.println(Thread.currentThread().getName()+"\t 第1次版本号"+stamp+"\t值是"+stampedReference.getReference());
        //暂停1秒钟t3线程
        try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }

        stampedReference.compareAndSet(100,101,stampedReference.getStamp(),stampedReference.getStamp()+1);
        System.out.println(Thread.currentThread().getName()+"\t 第2次版本号"+stampedReference.getStamp()+"\t值是"+stampedReference.getReference());
        stampedReference.compareAndSet(101,100,stampedReference.getStamp(),stampedReference.getStamp()+1);
        System.out.println(Thread.currentThread().getName()+"\t 第3次版本号"+stampedReference.getStamp()+"\t值是"+stampedReference.getReference());
    },"t3").start();

    new Thread(()->{
        int stamp = stampedReference.getStamp();
        System.out.println(Thread.currentThread().getName()+"\t 第1次版本号"+stamp+"\t值是"+stampedReference.getReference());
        //保证线程3完成1次ABA
        try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
        boolean result = stampedReference.compareAndSet(100, 2019, stamp, stamp + 1);
        System.out.println(Thread.currentThread().getName()+"\t 修改成功否"+result+"\t最新版本号"+stampedReference.getStamp());
        System.out.println("最新的值\t"+stampedReference.getReference());
    },"t4").start();
}
posted @ 2021-11-06 13:01  Pen9  阅读(40)  评论(0)    收藏  举报