public final CompletableFuture<V> start(@Nullable T arg, boolean failIfStarted) {
        return start(arg, null, failIfStarted);
    }
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 for
{@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
core/src/main/java/com/linecorp/armeria/common/util/StartStopSupport.java