В Java 8 появился новый класс CompletableFuture
, который позволяет удобно писать асинхронный код.
При использовании CompletableFuture
из нескольких потоков я столкнулся с его неочевидным поведением, а именно с тем, что callbacks на нём могут выполнятся совсем не в тех потоках, как ожидалось. Об этом и о том, как мне удалось решить проблему — я и расскажу в этой статье.
Мною разрабатывался асинхронный, неблокирующийся однопоточный клиент к серверу, который использовал потоконебезопасные структуры данных. Тесты проходили без проблем, но benchmarks иногда падали c ConcurrentModificationException
на внутренних структурах однопоточного клиента.
Читать полностью »