@Override
    public CompletableFuture<Boolean> whenInitialized() {
        CompletableFuture<Boolean> whenInitialized = this.whenInitialized;
        if (whenInitialized != null) {
            return whenInitialized;
        } else {
            whenInitialized = new CompletableFuture<>();
            if (whenInitializedUpdater.compareAndSet(this, null, whenInitialized)) {
                return whenInitialized;
            } else {
                final CompletableFuture<Boolean> oldWhenInitialized = this.whenInitialized;
                assert oldWhenInitialized != null;
                return oldWhenInitialized;
            }
        }
    }
Creates a new instance. Note that {@link #init()} method must be invoked to finish
the construction of this context.

@param sessionProtocol the {@link SessionProtocol} of the invocation
@param id the {@link RequestId} that contains the identifier of the current {@link Request}
          and {@link Response} pair.
@param req the {@link HttpRequest} associated with this context
@param rpcReq the {@link RpcRequest} associated with this context
@param requestStartTimeNanos {@link System#nanoTime()} value when the request started.
@param requestStartTimeMicros the number of microseconds since the epoch,
                              e.g. {@code System.currentTimeMillis() * 1000}.
core/src/main/java/com/linecorp/armeria/internal/client/DefaultClientRequestContext.java