Найти тему
DEBAGanov

Java 1086. Что такое Semaphore?

В 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