@Override
    public E poll() {
        // local load of field to avoid repeated loads after volatile reads
        final long[] lSequenceBuffer = sequenceBuffer;

        long consumerIndex = lvConsumerIndex();// LoadLoad
        final long seqOffset = calcCircularLongElementOffset(consumerIndex, mask);
        final long seq = lvLongElement(lSequenceBuffer, seqOffset);// LoadLoad
        final long delta = seq - (consumerIndex + 1);

        if (delta < 0) {
            // queue is empty
            return null;
        }

        // on 64bit(no compressed oops) JVM this is the same as seqOffset
        final long offset = calcCircularRefElementOffset(consumerIndex, mask);
        final E e = UnsafeRefArrayAccess.lpRefElement(buffer, offset);
        UnsafeRefArrayAccess.spRefElement(buffer, offset, null);
        // Move sequence ahead by capacity, preparing it for next offer
        // (seeing this value from a consumer will lead to retry 2)
        // StoreStore
        soLongElement(lSequenceBuffer, seqOffset, consumerIndex + mask + 1);
        soConsumerIndex(consumerIndex+1);
        return e;
    }
A Multi-Producer-Single-Consumer queue based on same algorithm used for {@link MpmcArrayQueue} but with the
appropriate weakening of constraints on offer. The trade off does not seem worth while compared to the simpler
{@link MpscArrayQueue}.

@param <E> type of the element stored in the {@link java.util.Queue}
jctools-experimental/src/main/java/org/jctools/queues/MpscSequencedArrayQueue.java