Почему класс AbstractReferenceCountingByteBuf в Netty-4.1.34 использует даже refCnt? - PullRequest
0 голосов
/ 17 июня 2019

Когда я вижу исходный код Netty-4.1.34, я обнаруживаю, что поле класса AbstractReferenceCountingByteBuf refCnt использует четное число, но в предыдущей версии это не так, в чем преимущество?

    // even => "real" refcount is (refCnt >>> 1); odd => "real" refcount is 0
    private volatile int refCnt = 2;

    // get real refCnt
    private static int realRefCnt(int rawCnt) {
        return (rawCnt & 1) != 0 ? 0 : rawCnt >>> 1;
    }

    private ByteBuf retain0(final int increment) {
        // all changes to the raw count are 2x the "real" change
        int adjustedIncrement = increment << 1; // overflow OK here
        int oldRef = refCntUpdater.getAndAdd(this, adjustedIncrement);
        if ((oldRef & 1) != 0) {
            throw new IllegalReferenceCountException(0, increment);
        }
        // don't pass 0!
        if ((oldRef <= 0 && oldRef + adjustedIncrement >= 0)
                || (oldRef >= 0 && oldRef + adjustedIncrement < oldRef)) {
            // overflow case
            refCntUpdater.getAndAdd(this, -adjustedIncrement);
            throw new IllegalReferenceCountException(realRefCnt(oldRef), increment);
        }
        return this;
    }
...