Паттерн Barrier, ч.1
Если для выполнения задачи нужно дождаться завершения других параллельных задач, то используется паттерн Barrier или барьерная синхронизация.
В нём есть 2 типа участников:
1️⃣ Исполнители — выполняют параллельные задачи и сигнализируют об окончании.
2️⃣ Наблюдатели — ждут завершения указанного количества задач.
В пакете java.util.concurrent этот паттерн реализуют 3 класса:
✅ CountDownLatch
✅ CyclicBarrier
✅ Phaser
В основе их реализации лежит счётчик. Каждый поток, который завершил задачу, уменьшает его значение. Барьер переходит в состояние "преодолён", когда счётчик достигает 0.
Посмотрим, как в них распределены роли:
✔️ CountDownLatch — чёткое разделение на исполнителей и наблюдателей. Потоки исполнителей уменьшают счётчик, затем могут продолжить работу или завершиться. Наблюдатели ждут преодоления барьера, затем выполняют свою задачу.
✔️ CyclicBarrier — роли исполнителей и наблюдателей совмещены. Поток завершает задачу, уменьшает счётчик и блокируется в ожидании остальных. Можно добавить действие, который выполнит последний поток перед тем, как барьер будет считаться преодолённым.
✔️ Phaser комбинирует функционал CountDownLatch и CyclicBarrier и допускает разные варианты использования. Исполнитель может ждать преодоления барьера, а может просто уменьшить счётчик и пойти дальше.
Это основная концептуальная разница между инструментами, которая определяет когда какой использовать. Больше технических аспектов рассмотрим в части 2.
#core
Post #26
2.44K
- ❤ 3
- 👍 3
- 🔥 1