• 位于 netty 自己的工具包下
    Netty核心接口源码之ReferenceCounted_访问冲突

一个引用计数的对象,需要显式取消分配。

当实例化一个新的ReferenceCounted时,它从引用计数1开始。



retain​ 引用计数加一
Netty核心接口源码之ReferenceCounted_显式_02



release​引用计数减一。如果引用计数减到0,则将显式释放对象,并且访问该释放对象通常会导致访问冲突。
Netty核心接口源码之ReferenceCounted_引用计数_03



如果实现ReferenceCounted的对象是其他实现ReferenceCounted的对象的容器,则当容器的引用计数变为0时,包含的对象也将通过release释放。

API

int refCnt() 返回对象的引用计数.如果返回0,意味着对象已经被回收.

ReferenceCounted retain() 将引用计数增加1

ReferenceCounted retain(int increment) 将引用计数增加指定数量

boolean release() 将引用计数减一, 如果引用计数达到0则回收这个对象. 注意: 返回的boolean值, 当且仅当引用计数变成0并且这个对象被回收才返回true.

boolean release(int decrement) 同上,将引用计数减少指定数量

ReferenceCounted touch(Object hint) 出于调试目的,用一个额外的任意的(arbitrary)信息记录这个对象的当前访问地址. 如果这个对象被检测到泄露了, 这个操作记录的信息将通过ResourceLeakDetector提供.

ReferenceCounted touch() 这个方法等价于touch(null).

注意除了refCnt()方法之外,其他的几个方法都是返回ReferenceCounted对象. 实现中一般时返回当前对象本身,以便实现链式(train)调用.