Сегодня напоролся на довольно неприятный баг в java.util.ServiceLoader, оказывается, по нему нельзя итерироваться в нескольких потоках. Так что сначала кэшируем содержимое, а потом уже кэш читаем параллельно.
Вот так делать нельзя, выходит:
ServiceLoader<MyService> loader = ServiceLoader.load(MyService.class); for (MyService optionConverter : loader) { // do something }
надо синхронизировать.