Netty-源码分析ByteBuf-readSlice和readRetainedSlice使用细节

这篇博客详细介绍了Netty中ByteBuf的readSlice和readRetainedSlice方法,它们都用于创建从当前readerIndex开始的子缓冲区,但readSlice不增加引用计数,而readRetainedSlice则会。文章通过实例展示了这两个方法使用后的原始缓冲区和子缓冲区的状态,包括readerIndex、readableBytes和引用计数的变化。
摘要由CSDN通过智能技术生成

readSlice

返回从当前readerIndex开始的此缓冲区的子区域的新分片,并将readerIndex增加新分片的大小(=长度)。
另请注意,此方法将不会调用retain(),因此不会增加引用计数。

跟slice极为相似,只是把原始缓冲区的readerIndex进行了增加

@Override
public ByteBuf readSlice(int length) {
        checkReadableBytes(length);
        ByteBuf slice = slice(readerIndex, length);
        readerIndex += length;
        return slice;
}
public static void main(String[] args) throws Exception {
		ByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;
		ByteBuf original = allocator.directBuffer(32);
		original.writeByte(1);
		original.writeByte(2);
		original.writeByte(3);
		original.writeByte(4);

		//分配子缓冲区
		ByteBuf sub = original.readSlice(3);

		//原始缓冲区readerIndex=3, readableBytes=1
		System.out.println("org.readerIndex = " + original.readerIndex());
		System.out.println("org.readableBytes = " + original.readableBytes());

		//原始缓冲区引用计数器不变refCnt=1
		System.out.println("org.refCnt=" + original.refCnt());
		//释放一次
		original.release();
}

readRetainedSlice

返回从当前readerIndex开始的此缓冲区的子区域的新分片,并将readerIndex增加新分片的大小(=长度)。
另请注意,此方法将会调用retain(),因此会增加引用计数。

 public ByteBuf readRetainedSlice(int length) {
        this.checkReadableBytes(length);
        ByteBuf slice = this.retainedSlice(this.readerIndex, length);
        this.readerIndex += length;
        return slice;
    }
	public static void main(String[] args) throws Exception {
		ByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;
		ByteBuf original = allocator.directBuffer(32);
		original.writeByte(1);
		original.writeByte(2);
		original.writeByte(3);
		original.writeByte(4);

		//分配子缓冲区
		ByteBuf sub = original.readRetainedSlice(3);

		//原始缓冲区readerIndex=3, readableBytes=1
		System.out.println("org.readerIndex = " + original.readerIndex());
		System.out.println("org.readableBytes = " + original.readableBytes());

		//原始缓冲区引用计数器改变refCnt=2
		System.out.println("org.refCnt=" + original.refCnt());
		//释放一次
		original.release();

		//子缓冲区再释放一次
		sub.release();
		System.out.println("org.refCnt=" + original.refCnt());
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值