@Override
    protected void process(ClusterDistributionManager dm) {
      ArrayList grantors = new ArrayList(); // svc names grantor for
      ArrayList grantorVersions = new ArrayList(); // grantor versions
      ArrayList grantorSerialNumbers = new ArrayList(); // serial numbers of grantor svcs
      ArrayList nonGrantors = new ArrayList(); // svc names non-grantor for
      try {
        if (dm.waitForElder(getSender())) {
          GrantorRequestProcessor.readyForElderRecovery(dm.getSystem(), getSender(), null);
          DLockService
              .recoverRmtElder(grantors, grantorVersions, grantorSerialNumbers, nonGrantors);
          reply(dm, grantors, grantorVersions, grantorSerialNumbers, nonGrantors);
        } else if (dm.getOtherNormalDistributionManagerIds().isEmpty()) {
          // Either we're alone (and received a message from an unknown member) or else we haven't
          // yet processed a view. In either case, we clearly don't have any grantors,
          // so we return empty lists.

          logger.info(LogMarker.DLS_MARKER,
              "{}: returning empty lists because I know of no other members.",
              this);
          reply(dm, grantors, grantorVersions, grantorSerialNumbers, nonGrantors);
        } else {
          logger.info(LogMarker.DLS_MARKER, "{}: disregarding request from departed member.", this);
        }
      } catch (InterruptedException e) {
        // shutting down
        logger.info("Elder initialization interrupted - will not send a reply");
      }
    }
Note the synchronization; we can only process one response at a time.
geode-core/src/main/java/org/apache/geode/distributed/internal/locks/ElderInitProcessor.java