zoukankan      html  css  js  c++  java
  • 并发编程之深入理解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)+"	"+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()+"	 第1次版本号"+stamp+"	值是"+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()+"	 第2次版本号"+stampedReference.getStamp()+"	值是"+stampedReference.getReference());
            stampedReference.compareAndSet(101,100,stampedReference.getStamp(),stampedReference.getStamp()+1);
            System.out.println(Thread.currentThread().getName()+"	 第3次版本号"+stampedReference.getStamp()+"	值是"+stampedReference.getReference());
        },"t3").start();
    
        new Thread(()->{
            int stamp = stampedReference.getStamp();
            System.out.println(Thread.currentThread().getName()+"	 第1次版本号"+stamp+"	值是"+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()+"	 修改成功否"+result+"	最新版本号"+stampedReference.getStamp());
            System.out.println("最新的值	"+stampedReference.getReference());
        },"t4").start();
    }
  • 相关阅读:
    Server2012R2 ADFS3.0 The same client browser session has made '6' requests in the last '13'seconds
    pig的grunt中shell命令不稳定,能不用尽量不用
    pig脚本的参数传入,多个参数传入
    pig的cogroup详解
    pig的limit无效(返回所有记录)sample有效
    Dynamics CRM2013 任务列表添加自定义按钮
    简述浏览器渲染机制
    如何区分浏览器类型
    使用mock.js生成前端测试数据
    理解Ajax
  • 原文地址:https://www.cnblogs.com/pengcode/p/15516576.html
Copyright © 2011-2022 走看看