美文网首页Java
Netty原理与基础(四)

Netty原理与基础(四)

作者: smallmartial | 来源:发表于2020-10-18 16:23 被阅读0次

    1. ByteBuf浅层复制的高级使用方式

    ByteBuf的浅层复制分为两种,有切片(slice)浅层复制和整体(duplicate)浅层复制。

    1.1 slice切片浅层复制

    ByteBuf的slice方法可以获取到一个ByteBuf的一个切片。一个ByteBuf可以进行多次的切片浅层复制;多次切片后的ByteBuf对象可以共享一个存储区域。

    slice方法有两个重载版本:
    (1)public ByteBuf slice()
    (2)public ByteBuf slice(int index, int length)第一个是不带参数的slice方法,在内部是调用了第二个带参数的slice方法.

    • 代码示例:
    public class SliceTest {
        @Test
        public  void testSlice() {
            ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer(9, 100);
            print("动作:分配 ByteBuf(9, 100)", buffer);
            buffer.writeBytes(new byte[]{1, 2, 3, 4});
            print("动作:写入4个字节 (1,2,3,4)", buffer);
            ByteBuf slice = buffer.slice();
            print("动作:切片 slice", slice);
        }
    
    }
    
    • 返回的切片是一个新的ByteBuf对象,该对象的几个重要属性值

    readerIndex(读指针)的值为0。
    writerIndex(写指针)的值为源Bytebuf的readableBytes()可读字节数。
    maxCapacity(最大容量)的值为源Bytebuf的readableBytes( )可读字节数
    · 切片不可以写入,原因是:maxCapacity与writerIndex值相同。
    · 切片和源ByteBuf的可读字节数相同,原因是:切片后的可读字节数为自己的属性writerIndex - readerIndex,也就是源ByteBuf的readableBytes() -0。
    · 切片不会复制源ByteBuf的底层数据,底层数组和源ByteBuf的底层数组是同一个。
    · 切片不会改变源ByteBuf的引用计数。

    • slice()无参数方法所生成的切片就是源ByteBuf可读部分的浅层复制。
    • duplicate() 和slice() 方法都是浅层复制。不同的是,slice()方法是切取一段的浅层复制,而duplicate( )是整体的浅层复制。
    • 浅层复制方法不会实际去复制数据,也不会改变ByteBuf的引用计数,这就会导致一个问题:在源ByteBuf调用release() 之后,一旦引用计数为零,就变得不能访问了;在这种场景下,源ByteBuf的所有浅层复制实例也不能进行读写了;如果强行对浅层复制实例进行读写,则会报错。
    • 浅层复制方法不会实际去复制数据,也不会改变ByteBuf的引用计数,这就会导致一个问题:在源ByteBuf调用release() 之后,一旦引用计数为零,就变得不能访问了;在这种场景下,源ByteBuf的所有浅层复制实例也不能进行读写了;如果强行对浅层复制实例进行读写,则会报错。

    相关文章

      网友评论

        本文标题:Netty原理与基础(四)

        本文链接:https://www.haomeiwen.com/subject/efscmktx.html