zoukankan      html  css  js  c++  java
  • AtomicIntegerFieldUpdater用法

    一个基于反射的工具类,它能对指定类的指定的volatile字段进行原子更新

    下面是netty源码中AbstractReferenceCountedByteBuf类的使用

    
        private static final AtomicIntegerFieldUpdater<AbstractReferenceCountedByteBuf> refCntUpdater;
    
        static {
            AtomicIntegerFieldUpdater<AbstractReferenceCountedByteBuf> updater =  PlatformDependent.newAtomicIntegerFieldUpdater(AbstractReferenceCountedByteBuf.class, "refCnt");
            if (updater == null) {
                updater = AtomicIntegerFieldUpdater.newUpdater(AbstractReferenceCountedByteBuf.class, "refCnt");
            }
            refCntUpdater = updater;
        }
    
    	// 必须用volative声明,保证多线程的可见性
        private volatile int refCnt = 1;
        
        
            @Override
        public ByteBuf retain() {
        	//失败重试
            for (;;) {
                int refCnt = this.refCnt;
                if (refCnt == 0) {
                    throw new IllegalReferenceCountException(0, 1);
                }
                if (refCnt == Integer.MAX_VALUE) {
                    throw new IllegalReferenceCountException(Integer.MAX_VALUE, 1);
                }
                //使用CAS对refcnt线程安全的操作
                if (refCntUpdater.compareAndSet(this, refCnt, refCnt + 1)) {
                    break;
                }
            }
            return this;
        }
        
            @Override
        public final boolean release() {
            for (;;) {
                int refCnt = this.refCnt;
                if (refCnt == 0) {
                    throw new IllegalReferenceCountException(0, -1);
                }
                // CAS 操作
                if (refCntUpdater.compareAndSet(this, refCnt, refCnt - 1)) {
                    if (refCnt == 1) {
                        deallocate();
                        return true;
                    }
                    return false;
                }
            }
        }
        
        
        
    
    
  • 相关阅读:
    C++ XML文件解析
    coco2d-x create tableView
    cocos2d-x button setTitleLabel
    cocos2d-X create std colorlayer
    Windows cmd "tree"
    C/C++ std::function && std::bind
    C/C++ “std::invoke”: 未找到匹配的重载函数
    31 迭代器 Iterator 是什么?
    30 哪些集合类是线程安全的?
    02 rpx 与 px
  • 原文地址:https://www.cnblogs.com/henuzyy/p/10415026.html
Copyright © 2011-2022 走看看