code: @SuppressWarnings("unchecked")
      public E take() throws InterruptedException
      {
          final E[] buffer = consumerBuffer;
          final long mask = consumerMask;
          
          final long cIndex = lpConsumerIndex();
          final long offset = modifiedCalcElementOffset(cIndex, mask);
          Object e = lvElement(buffer, offset);// LoadLoad
          if (e == null)
          {
              long pIndex = lvProducerIndex();
              if (cIndex == pIndex && casProducerIndex(pIndex, pIndex + 1))
              {
                  // producers only try a wakeup when both the index and the blocked thread are visible
                  soBlocked(Thread.currentThread());
                  do
                  {
                      LockSupport.park();
                      if (Thread.currentThread().isInterrupted())
                      {
                          throw new InterruptedException();
                      }
                  }
                  while (lvBlocked() != null);
              }
              // producer index is visible before element, so if we wake up between the index moving and the element
              // store we could see a null.
              e = spinWaitForElement(buffer, offset);
          }
  
          soElement(buffer, offset, null); // release element null
          soConsumerIndex(cIndex + 2); // release cIndex
          
          return (E) e;
      }
docs: {@inheritDoc}
  <p>
  This implementation is correct for single consumer thread use only.