@Override
        public E poll() {
            // local load of fields to avoid repeated loads after volatile reads
            final long[] sBuffer = sequenceBuffer;
            final long mask = this.mask;
            final Producer<E> producer = this.producer;
            final long currentConsumerIndex= lpConsumerIndex();
            long sOffset;
            while(true) {
                sOffset = calcSequenceOffset(currentConsumerIndex, mask);
                final long delta = lvSequence(sBuffer, sOffset) - (currentConsumerIndex + 1);
                if(delta == 0)
                    break;
                if (delta < 0 && currentConsumerIndex == producer.lvProducerIndex()) {
                    // strict empty check, this ensures [Queue.poll() == null iff isEmpty()]
                    return null;
                }
            }
            soConsumerIndex(currentConsumerIndex+1);
            return consumeElement(sBuffer, buffer, mask, currentConsumerIndex, sOffset);
        }
{@inheritDoc}
<p>
Because return null indicates queue is empty we cannot simply rely on next element visibility for poll and
must test producer index when next element is not visible.
jctools-experimental/src/main/java/org/jctools/queues/alt/MpscArrayConcurrentQueue.java