private void mutateAdditionalResponseHeaders(
            AtomicReferenceFieldUpdater<DefaultServiceRequestContext, HttpHeaders> atomicUpdater,
            Consumer<HttpHeadersBuilder> mutator) {
        for (;;) {
            final HttpHeaders oldValue = atomicUpdater.get(this);
            final HttpHeadersBuilder builder = oldValue.toBuilder();
            mutator.accept(builder);
            final HttpHeaders newValue = builder.build();
            if (atomicUpdater.compareAndSet(this, oldValue, newValue)) {
                return;
            }
        }
    }
Creates a new instance.

@param cfg the {@link ServiceConfig}
@param ch the {@link Channel} that handles the invocation
@param meterRegistry the {@link MeterRegistry} that collects various stats
@param sessionProtocol the {@link SessionProtocol} of the invocation
@param id the {@link RequestId} that represents the identifier of the current {@link Request}
          and {@link Response} pair.
@param routingContext the parameters which are used when finding a matched {@link Route}
@param routingResult the result of finding a matched {@link Route}
@param req the request associated with this context
@param sslSession the {@link SSLSession} for this invocation if it is over TLS
@param proxiedAddresses source and destination addresses delivered through proxy servers
@param clientAddress the address of a client who initiated the request
@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/server/DefaultServiceRequestContext.java