Skip to content

Latest commit

 

History

History
69 lines (52 loc) · 1.78 KB

abstractreferencecountedbytebuf.md

File metadata and controls

69 lines (52 loc) · 1.78 KB
# AbstractReferenceCountedByteBuf 对引用进行计数,类似于JVM内存回收的对象引用计数器,用于跟踪对象的分配和销毁,做自动内存回收。 ## 成员变量 ```java private static final AtomicIntegerFieldUpdater refCntUpdater = private volatile int refCnt; ``` ## 对象引用计数器 ### RETAIN ```java @Override public ByteBuf retain() { return retain0(1); } @Override public ByteBuf retain(int increment) { return retain0(checkPositive(increment, "increment")); } private ByteBuf retain0(final int increment) { int oldRef = refCntUpdater.getAndAdd(this, increment); if (oldRef <= 0 || oldRef + increment < oldRef) { // Ensure we don't resurrect (which means the refCnt was 0) and also that we encountered an overflow. refCntUpdater.getAndAdd(this, -increment); throw new IllegalReferenceCountException(oldRef, increment); } return this; } ``` 每次调用retain,计数器+1 ### RELEASE ```java @Override public boolean release() { return release0(1); } @Override public boolean release(int decrement) { return release0(checkPositive(decrement, "decrement")); } private boolean release0(int decrement) { int oldRef = refCntUpdater.getAndAdd(this, -decrement); if (oldRef == decrement) { deallocate(); return true; } else if (oldRef < decrement || oldRef - decrement > oldRef) { // Ensure we don't over-release, and avoid underflow. refCntUpdater.getAndAdd(this, decrement); throw new IllegalReferenceCountException(oldRef, -decrement); } return false; } ```