RabbitMQ客戶端原始碼分析(六)之IntAllocator
阿新 • • 發佈:2018-12-16
RabbitMQ-java-client版本
com.rabbitmq:amqp-client:4.3.0
RabbitMQ
版本宣告: 3.6.15
IntAllocator
-
用於分配給定範圍的Integer。主要用於產生
channelNumber
。核心是通過BitSet
來進行Integer的分配與釋放。 -
分配
channelNumber
是在ChannelManager
構造方法中channelMax = (1 << 16) - 1; channelNumberAllocator = new IntAllocator(1, channelMax);
-
IntAllocator
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,
-
分配一個整數
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 }
-
釋放
channelNumber
channelNumberAllocator.free(channelNumber); //將BitSet的index設定為true表示已經可以繼續利用 public void free(int reservation) { this.freeSet.set(reservation - this.loRange); }