code: @Override
      public synchronized void chainStarted(ChainData chainData) {
          chainState.set(ChainState.STARTED.val);
  
          final ActiveConfiguration cfg = currentConfig;
          final int port = cfg.getActivePort();
  
          if (port > 0) {
              // HOORAY! we have a bound listener.
              // Notify listeners that the chain was started.
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(this, tc, "New configuration started " + cfg);
              }
  
              VirtualHostMap.notifyStarted(owner, cfg.resolvedHost, port, isHttps);
  
              // Post an endpoint started event to anyone listening
              String topic = owner.getEventTopic() + HttpServiceConstants.ENDPOINT_STARTED;
              postEvent(topic, cfg, null);
          }
      }
docs: ChainEventListener method.
  This method can not be synchronized (deadlock with update/stop).
  Rely on CFW synchronization of chain operations.