В Java Semaphore (семафор) - это средство синхронизации, которое позволяет контролировать доступ к ресурсам в многопоточной среде. Он представляет собой счетчик, который может быть использован для ограничения количества потоков, имеющих доступ к определенному ресурсу или критической секции.
Семафор поддерживает две основные операции:
acquire(): Если значение счетчика семафора больше нуля, поток продолжает выполнение и значение счетчика уменьшается на единицу. Если значение счетчика равно нулю, поток блокируется до тех пор, пока другой поток не освободит ресурс и увеличит значение счетчика.
release(): Поток освобождает ресурс и увеличивает значение счетчика на единицу. Если есть потоки, ожидающие доступа к ресурсу, один из них получит доступ.
Семафор может быть создан с начальным значением счетчика, которое указывает на количество доступных ресурсов. Значение счетчика может изменяться динамически в процессе выполнения программы.
Semaphore часто используется для ограничения числа потоков, которые могут выполнять определенную операцию или получать доступ к ресурсам с ограниченной пропускной способностью, таким как базы данных, пулы соединений или ограниченное количество разрешений на выполнение определенных задач.
Пример использования Semaphore:
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
private static final int MAX_THREADS = 5;
private static final Semaphore semaphore = new Semaphore(MAX_THREADS);
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(new WorkerThread());
thread.start();
}
}
static class WorkerThread implements Runnable {
@Override public void run() {
try {
// Acquire the semaphore
semaphore.acquire();
// Access the shared resource or perform an operation
System.out.println("Thread " + Thread.currentThread().getId() + " is accessing the resource.");
Thread.sleep(2000); // Simulate some work
// Release the semaphore
semaphore.release();
System.out.println("Thread " + Thread.currentThread().getId() + " has released the resource.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
В приведенном выше примере создается Semaphore с максимальным числом потоков равным 5. Каждый поток запрашивает доступ к ресурсу с помощью acquire() перед выполнением работы и освобождает ресурс с помощью release() после завершения. Если все 5 потоков уже заняли ресурсы, следующие потоки будут ожидать освобождения ресурса другими потоками.
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov