code: public final CompletableFuture<V> start(@Nullable T arg, boolean failIfStarted) {
          return start(arg, null, failIfStarted);
      }
docs: Begins the startup procedure without an argument by calling {@link #doStart(Object)}, ensuring that
  neither {@link #doStart(Object)} nor {@link #doStop(Object)} is invoked concurrently. When the startup
  fails, {@link #stop()} will be invoked automatically to roll back the side effect caused by this method
  and any exceptions that occurred during the rollback will be reported to
  {@link #rollbackFailed(Throwable)}. This method is a shortcut of
  {@code start(arg, null, failIfStarted)}.
  
  @param arg           the argument to pass to {@link #doStart(Object)},
  or {@code null} to pass no argument.
  @param failIfStarted whether to fail the returned {@link CompletableFuture} with
  an {@link IllegalStateException} when the startup procedure is already
  in progress or done