RabbitMQ客户端源码分析(六)之IntAllocator

RabbitMQ-java-client版本

  1. com.rabbitmq:amqp-client:4.3.0
  2. RabbitMQ版本声明: 3.6.15

IntAllocator

  1. 用于分配给定范围的Integer。主要用于产生channelNumber。核心是通过BitSet来进行Integer的分配与释放。

  2. 分配channelNumber是在ChannelManager构造方法中

        channelMax = (1 << 16) - 1;
        channelNumberAllocator = new IntAllocator(1, channelMax);
    
  3. IntAllocator的成员变量与构造函数。传入参数按照上面的(1,channelMax)传入,来分析具体的执行值

        
        private final int loRange;     
        private final int hiRange; 
        private final int numberOfBits;     
        private int lastIndex = 0;   
        private final BitSet freeSet;
        //创建一个[bottom,top]返回的BitSet,从这个范围分配整数
        public IntAllocator(int bottom, int top) {
            this.loRange = bottom;//1
            this.hiRange = top + 1;//65535+1
            this.numberOfBits = hiRange - loRange;//65535
            this.freeSet = new BitSet(this.numberOfBits);
            //[0,this.numberOfBits)范围设置为true,表示可以分配
            this.freeSet.set(0, this.numberOfBits); //[0,65535)
        }
    
  4. 分配一个整数

        public int allocate() {
            //返回上次分配的索引
            int setIndex = this.freeSet.nextSetBit(this.lastIndex); //0
            if (setIndex<0) { // means none found in trailing part
                setIndex = this.freeSet.nextSetBit(0);
            }
            if (setIndex<0) return -1;
            //赋值设置上次分配的索引
            this.lastIndex = setIndex;
            //设置为false表示已经分配,此时(this.lastIndex,this.numberOfBits) 都是true,只有this.lastIndex是false
            this.freeSet.clear(setIndex);
            return setIndex + this.loRange;//0+1
        }
    
    
  5. 释放channelNumber

    
        channelNumberAllocator.free(channelNumber);
    
        //将BitSet的index设置为true表示已经可以继续利用
        public void free(int reservation) {
            this.freeSet.set(reservation - this.loRange);
        }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值