private boolean release0(int decrement) { for (;;) { int refCnt = this.refCnt; if (refCnt < decrement) { throw new IllegalReferenceCountException(refCnt, -decrement); } if (refCntUpdater.compareAndSet(this, refCnt, refCnt - decrement)) { if (refCnt == decrement) { deallocate(); return true; } return false; } } }
@Override public boolean release() { return release0(1); }
@Override public ReferenceCounted retain() { return retain0(1); }
@Override public ReferenceCounted touch() { return touch(null); }
@Override public ReferenceCounted touch() { return touch(null); }
@Override public ReferenceCounted retain(int increment) { return retain0(checkPositive(increment, "increment")); }
@Override public boolean release(int decrement) { return release0(checkPositive(decrement, "decrement")); }
private boolean release0(int decrement) { for (;;) { int refCnt = this.refCnt; if (refCnt < decrement) { throw new IllegalReferenceCountException(refCnt, -decrement); } if (refCntUpdater.compareAndSet(this, refCnt, refCnt - decrement)) { if (refCnt == decrement) { deallocate(); return true; } return false; } } }
@Override public ReferenceCounted retain() { return retain0(1); }
@Override public boolean release() { return release0(1); }
@Override public ReferenceCounted retain(int increment) { return retain0(checkPositive(increment, "increment")); }
@Override public boolean release(int decrement) { return release0(checkPositive(decrement, "decrement")); }