На конференции Joker 2020 было 3 доклада по теме многопоточности. Один из них - Thread Safety with Phaser, StampedLock and VarHandle. На примере
Phaser хорошо виден разрыв между теорией и практикой. В этом посте расскажу, почему.Паттерн Барьер помогает координировать потоки. Он блокирует один или несколько потоков, пока не наступит какое-то событие. JDK предлагает три реализации:
1️⃣
CountDownLatch
2️⃣ CyclicBarrier
3️⃣ Phaser
Последний - самый продвинутый:🔸 Несколько сценариев работы
🔸 Методы мониторинга
🔸 Можно строить иерархичные структуры из нескольких
Phaser
🔸 Иногда работает быстрее, чем CountDownLatch и CyclicBarrier
🔸 Обработка исключенийКласс
Phaser часто встречается на воркшопах и advanced java курсах. Можно долго рассказывать про методы, рисовать схемы и многопоточно перемножать двумерные массивы.Часто автор статьи или доклада держит фокус на инструменте:
Рассказываю про Phaser → Подбираю пример
На практике последовательность другая:
Вижу проблему → Ищу варианты → Выбираю подходящий
В такой цепочке у
Phaser нет шансов. За пределами конференций и статей этот класс не используется. Зачем тогда о нём говорить?
Чётко понимать, почему что-то НЕ работает, так же полезно, как и знать лучшие практики. Причиной может быть:
🔹 Плохой дизайн и неудобные методы
🔹 Неудачная реализация и проблемы производительности
🔹 Более подходящие инструменты
Чем плох
Phaser?Все реализации паттерна Барьер блокируют потоки, поэтому редко используются в нагруженных системах. Есть всего пара ситуаций, когда барьер - лучшее решение, но для их реализации достаточно
CountDownLatch или CyclicBarrier. Phaser неплохо спроектирован, но слишком оторван от практических задач, это наглядный пример over engineering.