code: public void enterWhen(Guard guard) throws InterruptedException {
      if (guard.monitor != this) {
        throw new IllegalMonitorStateException();
      }
      final ReentrantLock lock = this.lock;
      boolean signalBeforeWaiting = lock.isHeldByCurrentThread();
      lock.lockInterruptibly();
  
      boolean satisfied = false;
      try {
        if (!guard.isSatisfied()) {
          await(guard, signalBeforeWaiting);
        }
        satisfied = true;
      } finally {
        if (!satisfied) {
          leave();
        }
      }
    }
docs: Enters this monitor when the guard is satisfied. Blocks indefinitely, but may be interrupted.
  
  @throws InterruptedException if interrupted while waiting