相比于 compareAndSet 的实现,这里将 for 循环去掉

33 阅读1分钟

public abstract class AbstractReferenceCountedByteBuf extends AbstractByteBuf {

private volatile int refCnt;

protected AbstractReferenceCountedByteBuf(int maxCapacity) {
    super(maxCapacity);
    // 引用计数在初始的时候还是为 1 
    refCntUpdater.set(this, 1);
}

private ByteBuf retain0(final int increment) {
    // 相比于 compareAndSet 的实现,这里将 for 循环去掉
    // 并且每次是先对 refCnt 增加计数 increment
    int oldRef = refCntUpdater.getAndAdd(this, increment);
    // 增加完 refCnt 计数之后才去判断异常情况
    if (oldRef <= 0 || oldRef + increment < oldRef) {
        // Ensure we don't resurrect (which means the refCnt was 0) and also that we encountered an overflow.
        // 如果原来的 refCnt 已经为 0 或者 refCnt 溢出,则对 refCnt 进行回退,并抛出异常
        refCntUpdater.getAndAdd(this, -increment);
        throw new IllegalReferenceCountException(oldRef, increment);
    }
    return this;
}

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… private boolean release0(int decrement) { // 先对 refCnt 减少计数 decrement int oldRef = refCntUpdater.getAndAdd(this, -decrement); // 如果 refCnt 已经为 0 则进行 Native Memory 的释放 if (oldRef == decrement) { deallocate(); return true; } else if (oldRef < decrement || oldRef - decrement > oldRef) { // 如果释放次数大于 retain 次数 或者 refCnt 出现下溢 // 则对 refCnt 进行回退,并抛出异常 refCntUpdater.getAndAdd(this, decrement); throw new IllegalReferenceCountException(oldRef, decrement); } return false; } }

public abstract class AbstractReferenceCountedByteBuf extends AbstractByteBuf { // 获取 refCnt 字段在 ByteBuf 对象内存中的偏移 // 后续通过 Unsafe 对 refCnt 进行操作 private static final long REFCNT_FIELD_OFFSET = ReferenceCountUpdater.getUnsafeOffset(AbstractReferenceCountedByteBuf.class, "refCnt");

// 获取 refCnt 字段 的 AtomicFieldUpdater
// 后续通过 AtomicFieldUpdater 来操作 refCnt 字段
private static final AtomicIntegerFieldUpdater<AbstractReferenceCountedByteBuf> AIF_UPDATER =
        AtomicIntegerFieldUpdater.newUpdater(AbstractReferenceCountedByteBuf.class, "refCnt");
        
        https://www.laipuhuo.com/goodsDetail/0162E9DA653D44AB839D215FA6BD4BA5.html

www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail… www.laipuhuo.com/goodsDetail…

// 创建 ReferenceCountUpdater,对于引用计数的所有操作最终都会代理到这个类中
private static final ReferenceCountUpdater<AbstractReferenceCountedByteBuf> updater =
        new ReferenceCountUpdater<AbstractReferenceCountedByteBuf>() {
    @Override
    protected AtomicIntegerFieldUpdater<AbstractReferenceCountedByteBuf> updater() {
        // 通过 AtomicIntegerFieldUpdater 操作 refCnt 字段
        return AIF_UPDATER;
    }
    @Override
    protected long unsafeOffset() {
        // 通过 Unsafe 操作 refCnt 字段
        return REFCNT_FIELD_OFFSET;
    }
};
// ByteBuf 中的引用计数,初始为 2 (偶数)
private volatile int refCnt = updater.initialValue();

}