public final T retain(T instance) {
// 引用计数逻辑上是加 1 ,但实际上是加 2 (实现角度)
return retain0(instance, 1, 2);
}
public final T retain(T instance, int increment) {
// all changes to the raw count are 2x the "real" change - overflow is OK
// rawIncrement 始终是逻辑计数 increment 的两倍
int rawIncrement = checkPositive(increment, "increment") << 1;
// 将 rawIncrement 设置到 ByteBuf 的 refCnt 字段中
return retain0(instance, increment, rawIncrement);
}
www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… // rawIncrement = increment << 1 // increment 表示引用计数的逻辑增长步长 // rawIncrement 表示引用计数的实际增长步长 private T retain0(T instance, final int increment, final int rawIncrement) { // 先通过 XADD 指令将 refCnt 的值加起来 int oldRef = updater().getAndAdd(instance, rawIncrement); // 如果 oldRef 是一个奇数,也就是 ByteBuf 已经没有引用了,抛出异常 if (oldRef != 2 && oldRef != 4 && (oldRef & 1) != 0) { // 如果 oldRef 已经是一个奇数了,无论多线程在这里怎么并发 retain ,都是一个奇数,这里都会抛出异常 throw new IllegalReferenceCountException(0, increment); } // don't pass 0! // refCnt 不可能为 0 ,只能是 1 if ((oldRef <= 0 && oldRef + rawIncrement >= 0) || (oldRef >= 0 && oldRef + rawIncrement < oldRef)) { // 如果 refCnt 字段已经溢出,则进行回退,并抛异常 updater().getAndAdd(instance, -rawIncrement); throw new IllegalReferenceCountException(realRefCnt(oldRef), increment); } return instance; }