code: public long poll(long timeout, TimeUnit unit)
              throws InterruptedException, TimeoutException {
  
          final int readLocation = this.consumerReadLocation;
          int nextReadLocation = blockForReadSpace(timeout, unit, readLocation);
  
          // purposely non volatile as the read memory barrier occurred when we read 'writeLocation'
          final long value = data[readLocation];
          setReadLocation(nextReadLocation);
  
          return value;
  
      }
docs: Retrieves and removes the head of this queue, waiting up to the specified wait time if necessary for an
  element to become available.
  
  @param timeout how long to wait before giving up, in units of <tt>unit</tt>
  @param unit    a <tt>TimeUnit</tt> determining how to interpret the <tt>timeout</tt> parameter
  @return the head of this queue, or throws a <tt>TimeoutException</tt> if the specified waiting time
  elapses before an element is available
  @throws InterruptedException                  if interrupted while waiting
  @throws java.util.concurrent.TimeoutException if timeout time is exceeded