code: public void reset() {
          synchronized (lock) {
              released = false;
              e = null;
              result = null;
              runningThreadId = null;
          }
      }
docs: If {@link #release(Object)} or {@link #releaseExceptionally(Throwable)} has been called it
  resets the object into the unreleased state. If release has not been called this will have no effect.