@Override
    public void finishInitialization(boolean success) {
        final CompletableFuture<Boolean> whenInitialized = this.whenInitialized;
        if (whenInitialized != null) {
            whenInitialized.complete(success);
        } else {
            if (!whenInitializedUpdater.compareAndSet(this, null,
                                                      UnmodifiableFuture.completedFuture(success))) {
                final CompletableFuture<Boolean> oldWhenInitialized = this.whenInitialized;
                assert oldWhenInitialized != null;
                oldWhenInitialized.complete(success);
            }
        }
    }
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