private synchronized void processData(ArrayList rmtGrantors, ArrayList rmtGrantorVersions,
      ArrayList rmtGrantorSerialNumbers, ArrayList rmtNonGrantors,
      InternalDistributedMember rmtId) {
    {
      Iterator iterGrantorServices = rmtGrantors.iterator();
      Iterator iterGrantorVersions = rmtGrantorVersions.iterator();
      Iterator iterGrantorSerialNumbers = rmtGrantorSerialNumbers.iterator();
      while (iterGrantorServices.hasNext()) {
        String serviceName = (String) iterGrantorServices.next();
        long versionId = (Long) iterGrantorVersions.next();
        int serialNumber = (Integer) iterGrantorSerialNumbers.next();
        GrantorInfo oldgi = (GrantorInfo) grantors.get(serviceName);
        if (oldgi == null || oldgi.getVersionId() < versionId) {
          grantors.put(serviceName, new GrantorInfo(rmtId, versionId, serialNumber, false));
          crashedGrantors.remove(serviceName);
        }
      }
    }
    {
      for (final Object rmtNonGrantor : rmtNonGrantors) {
        String serviceName = (String) rmtNonGrantor;
        if (!grantors.containsKey(serviceName)) {
          crashedGrantors.add(serviceName);
        }
      }
    }
  }
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