Что такое Phaser в Java?

«Что такое Phaser в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Phaser — это гибкий синхронизатор из пакета java.util.concurrent, который управляет выполнением потоков в несколько фаз. В отличие от CountDownLatch и CyclicBarrier, он позволяет динамически изменять количество потоков-участников между фазами.

Основные принципы:

  • Потоки регистрируются в фазере через register() или bulkRegister().
  • Основной метод arriveAndAwaitAdvance() — поток сообщает о прибытии на текущую фазу и блокируется, пока все зарегистрированные потоки не сделают то же самое.
  • Поток может покинуть пул участников, вызвав arriveAndDeregister().
  • Количество фаз (итераций) не ограничено.

Пример использования:

import java.util.concurrent.Phaser;

public class PhaserExample {
    public static void main(String[] args) {
        // Создаем Phaser с 3 зарегистрированными сторонами (потоками)
        Phaser phaser = new Phaser(3);

        for (int i = 0; i < 3; i++) {
            final int threadId = i;
            new Thread(() -> {
                System.out.println("Поток " + threadId + " прибыл на фазу " + phaser.getPhase());
                phaser.arriveAndAwaitAdvance(); // Ждем всех
                System.out.println("Поток " + threadId + " выполняет работу после фазы " + (phaser.getPhase()-1));
                // Второй поток покидает синхронизацию после первой фазы
                if (threadId == 1) {
                    phaser.arriveAndDeregister();
                } else {
                    phaser.arriveAndAwaitAdvance(); // Остальные ждут вторую фазу
                }
            }).start();
        }
    }
}

Когда использовать: Для сложных, многоэтапных задач (например, обработка данных), где количество рабочих потоков может меняться на разных этапах.