docs: public Object take() throws InterruptedException {
  
          Object old = null;
  
          // D312598 - begin
          while (true) {
              synchronized (this) {
                  if (numberOfUsedSlots.get() > 0) {
                      old = extract();
                      numberOfUsedSlots.getAndDecrement();
                  }
                  if (old != null) {
                      // PK77809 Decrement the number of waiting threads since we will be
                      // returning a work item to a waiting thread to execute.
                      waitingThreads--;
                  }
              }
  
              if (old != null) {
                  notifyPut_();
                  return old;
              }
  
              int spinctr = SPINS_TAKE_;
              while (numberOfUsedSlots.get() <= 0) {
                  // busy wait
                  if (spinctr > 0) {
                      if (YIELD_TAKE_)
                          Thread.yield();
                      spinctr--;
                  } else {
                      // block on lock
                      // D638088 - Allow waitGet_ to determine timeout value by passing
                      // negative value as parameter.
                      waitGet_(-1);
                  }
              }
          }
          // D312598 - end
  
      }