1. io.netty.buffer.AbstractReferenceCountedByteBuf 概览
AbstractReferenceCountedByteBuf 是所有支持引用计数的 ByteBuf 实现的共同父类。它继承自 AbstractByteBuf(管理读写指针和容量),并在此基础上,实现了 ReferenceCounted 接口,赋予了 ByteBuf 生命周期的管理能力。
它的主要职责是:
- 管理引用计数:提供原子操作来增加 (
retain()) 和减少 (release()) 引用计数。 - 触发资源释放:当引用计数归零时,自动调用抽象方法
deallocate()来释放底层内存资源。 - 线程安全:通过原子操作确保引用计数在多线程环境下的正确性。
// netty/buffer/AbstractReferenceCountedByteBuf.java
package io.netty.buffer;
import io.netty.util.IllegalReferenceCountException;
import io.netty.util.ReferenceCounted; // 引用计数接口
import io.netty.util.internal.ObjectUtil;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; // 用于原子更新引用计数
/**
* ByteBuf 的抽象基类,实现了 ReferenceCounted 接口,提供了引用计数的核心逻辑。
* 所有支持引用计数的 ByteBuf 实现(如池化或非池化的堆/直接内存 ByteBuf)都继承自此。
*/
public abstract class AbstractReferenceCountedByteBuf extends AbstractByteBuf {
// 静态的 AtomicIntegerFieldUpdater,用于原子地更新 refCnt 字段。
// 这种方式比使用 synchronized 或 ReentrantLock 效率更高。
private static final AtomicIntegerFieldUpdater<AbstractReferenceCountedByteBuf> REFCNT_UPDATER =
AtomicIntegerFieldUpdater.newUpdater(AbstractReferenceCountedByteBuf.class, "refCnt");
// volatile 关键字保证了 refCnt 在多线程间的可见性。
// refCnt 表示当前 ByteBuf 被引用的次数。
// 当 refCnt 降为 0 时,ByteBuf 的底层资源将被释放。
private volatile int refCnt;
// 构造函数,通常在创建时将引用计数初始化为 1
protected AbstractReferenceCountedByteBuf(int maxCapacity) {
super(maxCapacity); // 调用父类 AbstractByteBuf 的构造函数
setRefCnt(1); // 初始化引用计数为 1
}
/**
* 返回当前 ByteBuf 的引用计数。
* @return 当前引用计数
*/
@Override
public final int refCnt() {
return refCnt;
}
/**
* 设置引用计数。这是内部方法,通常由构造函数或内部逻辑调用。
*
* @param refCnt 要设置的引用计数值
*/
protected final void setRefCnt(int refCnt) {
// 通常在内部使用,例如构造函数初始化
REFCNT_UPDATER.set(this, refCnt);
}
/**
* 增加引用计数。
* 当需要共享 ByteBuf 给其他组件或异步操作时,调用此方法以防止其过早释放。
*
* @return 当前 ByteBuf 实例,支持链式调用
* @throws IllegalReferenceCountException 如果 ByteBuf 已经释放 (refCnt <= 0)
*/
@Override
public fi

最低0.47元/天 解锁文章
2297

被折叠的 条评论
为什么被折叠?



