@Override
        public void run() throws Throwable {
            val upc = new UsernamePasswordCredential(username, "password");
            for (var i = 0; i < EXECUTIONS_PER_USER; i++) {
                try {
                    val person = personDirectoryResolver.resolve(upc);
                    val attributes = person.getAttributes();
                    assertEquals(username, person.getId());
                    LOGGER.debug("Fetched person: [{}] [{}], last-name [{}]", attributes.get("uid"),
                        attributes.get("lastName"), attributes.get("nickname"));
                } catch (final Throwable e) {
                    LOGGER.warn("Error getting person: [{}]", e.getMessage(), e);
                    throw e;
                }
            }
        }
Assert a list of runnables can run in parallel without any concurrency related exceptions.
Use CountDownLatch to start all threads at same time and wait for them to finish.

@param message           error message
@param runnables         list of runnables
@param maxTimeoutSeconds timeout for test completion
@throws InterruptedException interruption
support/cas-server-support-person-directory/src/test/java/org/apereo/cas/PersonDirectoryPrincipalResolverConcurrencyTests.java