Ответ
Пакет 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();