Паттерн Barrier, часть 2
В предыдущей части мы рассмотрели разные реализации паттерна Barrier в java.util.concurrent.
Посмотрим на отличия в использовании. Они касаются того
▪️когда ставится начальное значение счётчика,
▪️что происходит после преодоления барьера.
1️⃣ CountDownLatch
✔️ Счётчик задаётся при создании объекта.
✔️ Поток, который встал на await(), блокируется без возможности прерывания.
✔️ Когда значение счётчика достигает 0, наблюдатель продолжает работу, а сам объект CountDownLatch больше использовать нельзя, он одноразовый.
2️⃣ CyclicBarrier
✔️ Начальное значение счётчика тоже задаётся в конструкторе.
✔️ Поток, который дошёл до барьера, блокируется.
✔️ При преодолении барьера счётчик возвращается в исходное значение и готов снова собирать потоки. Количество циклов бесконечно.
3️⃣ Phaser. Каждый цикл называется фазой.
✔️ Начальное значение счётчика может меняться в каждой фазе.
✔️ Количество фаз по умолчанию бесконечно, но можно выставить ограничение с помощью функции onAdvance.
✔️ Ожидание наблюдателей может быть блокирующим или прерываемым.
Phaser включает в себя весь функционал CountDownLatch и CyclicBarrier. Он гибкий и помогает реализовывать сложные сценарии.
При выборе класса для реализации барьера, помните простую мудрость:
✴️ Если задача решается просто, нужно решать её просто.
#core
Post #27
2.21K
- ❤ 2
- 👍 1