共同学习Netty源代码--ByteBuf(一)

来源:互联网 发布:dlt算法~ 编辑:程序博客网 时间:2024/05/16 19:24

Java NIO的API中最重要的三个接口是Selector、Channel和Buffer,其中Selector就像公交车调度管理者、Channel就像公交车、Buffer就像公交车上的座位,而数据就像乘客在这三个的协同作用下进行传输。

Netty封装了自己的buffer,也就是ByteBuf抽象类,先来看这个类。

public abstract class ByteBuf implements ReferenceCounted, Comparable<ByteBuf>

这个抽象类实现了ReferenceCounted接口和Comparable接口,后者不必多说,前者我查了一下资料,说是Netty4开始,相关对象的生命周期不再由垃圾回收器管理,而是由这个接口的实现类管理,来改进分配内存和释放内存的性能。从字面意义来看,这个接口的含义是引用计数,我的理解是,堆内存里的对象在栈内存中有多少引用。

这个接口定义了几个方法:

    int refCnt();

返回引用数,如果为0,则表示该对象没有引用了。

    ReferenceCounted retain();

这个方法用来增加一个引用计数器。

    ReferenceCounted retain(int increment);

这个方法用来增加指定个引用计数器。

    ReferenceCounted touch();

这个方法记录了当前可访问的位置,现在还不懂这个位置是什么。

    ReferenceCounted touch(Object hint);

这个方法和上面一样,但是传入了一些备用信息。

    boolean release();

这个方法用来减少一个引用计数器。

    boolean release(int decrement);

这个方法用来减少若干个引用计数器。

如果引用计数器减少到0,那么这个对象就会被收回。

现在回来看ByteBuf类。

public abstract int capacity();

这个抽象方法用来返回这个缓冲区可以承载多少字节的数据。

public abstract ByteBuf capacity(int newCapacity);

这个抽象方法用来替换当前这个缓冲区的容量,如果参数容量小于当前容量,则会砍掉一部分当前容量中的数据,反之会增加一些未被占有的容量。

public abstract int maxCapacity();

这个方法返回这个缓冲区最大的容量。

public abstract ByteBufAllocator alloc();

这个抽象方法返回分配这个缓冲区的ByteBufAllocator,也就是缓冲区分配器。 

public abstract ByteOrder order();

这个方法返回这个缓冲区的字节顺序。

public abstract ByteBuf order(ByteOrder endianness);

这个方法返回一个按照参数字节排序方式排序的ByteBuf。

public abstract ByteBuf unwrap();

如果这个缓冲区包裹了别的缓冲区,则返回被包裹的缓冲区,否则返回空。


0 0