code: @Override
      public E poll() {
          final long consumerIndex = lvConsumerIndex(); // LoadLoad
          final int offset = calcElementOffset(consumerIndex);
          // Copy field to avoid re-reading after volatile load
          final AtomicReferenceArray<E> buffer = this.buffer;
  
          // If we can't see the next available element we can't poll
          E e = lvElement(buffer, offset); // LoadLoad
          if (null == e) {
              /*
               * NOTE: Queue may not actually be empty in the case of a producer (P1) being interrupted after
               * winning the CAS on offer but before storing the element in the queue. Other producers may go on
               * to fill up the queue after this element.
               */
              if (consumerIndex != lvProducerIndex()) {
                  do {
                      e = lvElement(buffer, offset);
                  } while (e == null);
              } else {
                  return null;
              }
          }
  
          spElement(buffer, offset, null);
          soConsumerIndex(consumerIndex + 1); // StoreStore
          return e;
      }
docs: {@inheritDoc}
  <p>
  IMPLEMENTATION NOTES:<br>
  Lock free poll using ordered loads/stores. As class name suggests access is limited to a single thread.
  
  @see java.util.Queue#poll()
  @see org.jctools_voltpatches.queues.MessagePassingQueue#poll()