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

南楼画角 提交于 2019-12-10 05:50:08

返回从当前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();
}

 


	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());
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!