zoukankan      html  css  js  c++  java
  • 原子引用

    原子引用

    带版本号 的原子操作!

    public class CASDemo {
    
        //AtomicStampedReference 注意,如果泛型是一个包装类,注意对象的引用问题
    
        // 正常在业务操作,这里面比较的都是一个个对象
        static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<>(1,1);
    
        // CAS  compareAndSet : 比较并交换!
        public static void main(String[] args) {
    
            new Thread(()->{
                int stamp = atomicStampedReference.getStamp(); // 获得版本号
                System.out.println("a1=>"+stamp);
    
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                Lock lock = new ReentrantLock(true);
    
                atomicStampedReference.compareAndSet(1, 2,
                        atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1);
    
                System.out.println("a2=>"+atomicStampedReference.getStamp());
    
    
                System.out.println(atomicStampedReference.compareAndSet(2, 1,
                        atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1));
    
                System.out.println("a3=>"+atomicStampedReference.getStamp());
    
            },"a").start();
    
    
            // 乐观锁的原理相同!
            new Thread(()->{
                int stamp = atomicStampedReference.getStamp(); // 获得版本号
                System.out.println("b1=>"+stamp);
    
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                System.out.println(atomicStampedReference.compareAndSet(1, 6,
                        stamp, stamp + 1));
    
                System.out.println("b2=>"+atomicStampedReference.getStamp());
    
            },"b").start();
    
        }
    }
    

    注意: Integer 使用了对象缓存机制,默认范围是 -128 ~ 127 ,推荐使用静态工厂方法 valueOf 获取对象实 例,而不是 new,因为 valueOf 使用缓存,而 new 一定会创建新的对象分配新的内存空间;

    image-20200805121508207

    视频参考https://www.bilibili.com/video/BV1B7411L7tE
    上一篇:理解CAS
    下一篇:各种锁的理解

  • 相关阅读:
    以《淘宝网》为例,描绘质量属性的六个常见属性场景
    架构漫谈读后感
    软件体系架构课下作业01
    架构之美阅读笔记06
    架构之美阅读笔记05
    架构之美阅读笔记04
    架构之美阅读笔记03
    架构之美阅读笔记02
    架构之美阅读笔记01
    学习进度15
  • 原文地址:https://www.cnblogs.com/junlinsky/p/13443384.html
Copyright © 2011-2022 走看看