code: @Override
    public void close() throws IOException {
      try {
        this.unlock();
      } catch (JobLockException e) {
        throw new IOException(e);
      } finally {
        lockEventListeners.remove(this.lockPath);
      }
    }
docs: Closes this stream and releases any system resources associated
  with it. If the stream is already closed then invoking this
  method has no effect.
  
  @throws IOException if an I/O error occurs