code: public void put(E value) throws InterruptedException {
  
          final int writeLocation1 = this.producerWriteLocation;
          final int nextWriteLocation = blockForWriteSpaceInterruptibly(writeLocation1);
  
          // purposely not volatile see the comment below
          data[writeLocation1] = value;
  
          setWriteLocation(nextWriteLocation);
      }
docs: Inserts the specified element into this queue, waiting if necessary
  for space to become available.
  
  @param value the element to add
  @throws InterruptedException     if interrupted while waiting
  @throws IllegalArgumentException if some property of the specified
  element prevents it from being added to this queue