Какие синхронизаторы из пакета java.util.concurrent вы знаете и для чего они применяются?

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

Ответ

Пакет java.util.concurrent предоставляет высокоуровневые синхронизаторы для координации потоков:

Синхронизатор Назначение Краткое описание
Semaphore Ограничение доступа Контролирует число потоков, одновременно получающих доступ к ресурсу.
CountDownLatch Ожидание завершения Позволяет потоку(ам) ждать, пока другие потоки не выполнят набор операций (счетчик сбрасывается).
CyclicBarrier Точка сбора Заставляет группу потоков ждать друг друга в общей точке барьера (может использоваться повторно).
Phaser Гибкая синхронизация фаз Более гибкий CyclicBarrier с динамическим числом участников и иерархией.
Exchanger Обмен данными Точка встречи двух потоков для обмена объектами.

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

// 1. Semaphore: Ограничиваем подключения к ресурсу (напр., к БД) до 3-х.
Semaphore dbSemaphore = new Semaphore(3);
try {
    dbSemaphore.acquire();
    // Работа с БД...
} finally {
    dbSemaphore.release();
}

// 2. CountDownLatch: Главный поток ждет завершения 3-х рабочих потоков.
CountDownLatch startLatch = new CountDownLatch(1);
CountDownLatch doneLatch = new CountDownLatch(3);

for (int i = 0; i < 3; i++) {
    new Thread(() -> {
        startLatch.await(); // Все ждут сигнала старта
        // Выполнение работы...
        doneLatch.countDown();
    }).start();
}
// Подготовка...
startLatch.countDown(); // Запускаем все потоки одновременно
doneLatch.await(); // Ждем завершения всех
System.out.println("Все потоки завершили работу");

// 3. CyclicBarrier: 3 потока вычисляют часть задачи, затем объединяют результат.
CyclicBarrier barrier = new CyclicBarrier(3, 
    () -> System.out.println("Все части вычислены, можно объединять"));
// В каждом потоке:
// computePartialResult();
// barrier.await();