zoukankan      html  css  js  c++  java
  • 多线程并发安全计数器实现限流(四)CAS

    cas 计数器

    public class CounterCAS implements Counter {
    
        volatile int i = 0; // 本质是修改内存中某一个变量的值
    
        static Unsafe unsafe;
    
        private static long valueOffSet;
    
        static {
            try {
                // 反射获取属性
                Field field = Unsafe.class.getDeclaredField("theUnsafe");
                field.setAccessible(true);
                unsafe = (Unsafe) field.get(null);
    
                Field fieldi = CounterCAS.class.getDeclaredField("i");
                valueOffSet = unsafe.objectFieldOffset(fieldi);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public int incr() {
            for (; ; ) {
                int current = i;
                int update = current + 1;
                if(unsafe.compareAndSwapInt(this,valueOffSet, current, update)){
                    return update;// CAS 直接操作到内存层面
                }
    
            }
        }
    
        public int decr() {
            for (; ; ) {
                // 1. 获取i的值
                int current = i;
                // 2. 进行计算
                int update = current - 1;
                // CAS 近似硬件层面的操作(JDK和JVM 做的封装)
                if (unsafe.compareAndSwapInt(this, valueOffSet, current, update)) {
                    return update;
                }
            }
        }
    
        @Override
        public int get() {
            return i;
        }
    }
    

      

  • 相关阅读:
    uva11021
    WC2019退役失败记
    北大集训2018垫底记
    NOI后训练记录
    NOI2018垫底记
    NOI前训练记录
    JSOI2018R2游(afo)记
    HNOI(AHOI)2018游记
    JSOI2018R1(九省联考)游(afo)记
    LR 8 Hello 戊戌
  • 原文地址:https://www.cnblogs.com/Jomini/p/13623366.html
Copyright © 2011-2022 走看看