@Override
    public E relaxedPoll()
    {
        final int chunkMask = this.chunkMask;
        final long cIndex = this.lpConsumerIndex();
        final int ciChunkOffset = (int) (cIndex & chunkMask);

        MpscUnboundedXaddChunk<E> cChunk = this.lpConsumerChunk();
        E e;
        // start of new chunk?
        if (ciChunkOffset == 0 && cIndex != 0)
        {
            final MpscUnboundedXaddChunk<E> next = cChunk.lvNext();
            if (next == null)
            {
                return null;
            }
            e = next.lvElement(0);

            // if the next chunk doesn't have the first element set we give up
            if (e == null)
            {
                return null;
            }
            moveToNextConsumerChunk(cChunk, next);

            cChunk = next;
        }
        else
        {
            e = cChunk.lvElement(ciChunkOffset);
            if (e == null)
            {
                return null;
            }
        }

        cChunk.soElement(ciChunkOffset, null);
        soConsumerIndex(cIndex + 1);
        return e;
    }
@param chunkSize The buffer size to be used in each chunk of this queue
@param maxPooledChunks The maximum number of reused chunks kept around to avoid allocation, chunks are pre-allocated
jctools-core/src/main/java/org/jctools/queues/MpscUnboundedXaddArrayQueue.java