Каким образом семафор управляет синхронизацией и ожиданием завершения работы нескольких потоков?
Ответ от нейросети
sobes.tech AI
Семафор в Java — это механизм синхронизации, который управляет доступом к ограниченному числу ресурсов или контролирует количество одновременно выполняющихся потоков. Он содержит счетчик, который уменьшается при захвате семафора (acquire) и увеличивается при освобождении (release).
Если счетчик равен нулю, потоки, пытающиеся выполнить acquire, блокируются и ждут, пока другой поток вызовет release. Таким образом, семафор позволяет ограничить количество потоков, выполняющих критическую секцию, и организовать ожидание завершения работы нескольких потоков.
Пример использования семафора для ограничения одновременного доступа к ресурсу:
import java.util.concurrent.Semaphore;
Semaphore semaphore = new Semaphore(3); // максимум 3 потока одновременно
void accessResource() {
try {
semaphore.acquire(); // захват семафора
// критическая секция
System.out.println(Thread.currentThread().getName() + " получил доступ");
Thread.sleep(1000); // имитация работы
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
semaphore.release(); // освобождение семафора
System.out.println(Thread.currentThread().getName() + " освободил доступ");
}
}
Таким образом, семафор управляет синхронизацией, блокируя потоки при достижении лимита и разблокируя их по мере освобождения ресурсов, что позволяет организовать корректное ожидание и завершение работы потоков.