@Obsolete
  public static <T, E extends Throwable> T withLock(@NotNull Lock lock, @NotNull ThrowableComputable<T, E> runnable) throws E {
    lock.lock();
    try {
      return runnable.compute();
    }
    finally {
      lock.unlock();
    }
  }
@Obsolete
  public static <T, E extends Throwable> T withLock(@NotNull Lock lock, @NotNull ThrowableComputable<T, E> runnable)