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
    下一篇:各种锁的理解

  • 相关阅读:
    050819no JLINK device found
    050819流水账
    C语言附录的一些小摘要
    020819存疑点&error&warning
    020819流水账
    010819流水账
    310719存疑点&error&warning
    310719流水账
    300719流水账
    linux内核获取当前进程路径分析
  • 原文地址:https://www.cnblogs.com/junlinsky/p/13443384.html
Copyright © 2011-2022 走看看