code: public Reason wait(T waiter)
      {
          return wait(waiter, Long.MAX_VALUE, TimeUnit.MILLISECONDS);
      }
docs: Adds waiter to queue and waits until releaseAll method call or thread is
  interrupted.
  @param waiter
  @return