![image](https://habrastorage.org/files/d87/570/a6a/d87570a6ab2f466897dcb5408686c66d.jpg)
CompletableFuture
, который позволяет удобно писать асинхронный код.При использовании
CompletableFuture
из нескольких потоков я столкнулся с его неочевидным поведением, а именно с тем, что callbacks на нём могут выполнятся совсем не в тех потоках, как ожидалось. Об этом и о том, как мне удалось решить проблему — я и расскажу в этой статье.Мною разрабатывался асинхронный, неблокирующийся однопоточный клиент к серверу, который использовал потоконебезопасные структуры данных. Тесты проходили без проблем, но benchmarks иногда падали c
ConcurrentModificationException
на внутренних структурах однопоточного клиента.