Многопоточность

Что такое семафор? Как он реализован в Java?


Семафор - это синхронизационный механизм, который используется для ограничения доступа к ресурсам в многопоточной среде. Он позволяет контролировать количество потоков, которые могут одновременно получить доступ к определенному ресурсу или выполнить определенную операцию. В Java семафор реализован с использованием класса `Semaphore` из пакета `java.util.concurrent` . Он предоставляет несколько методов для работы с семафорами: 1. `acquire()` : Запрашивает доступ к ресурсу. Если доступ разрешен, поток продолжает выполнение. Если доступ запрещен, поток блокируется до тех пор, пока не будет разрешен доступ. 2. `release()` : Освобождает ресурс и разрешает доступ другим потокам. 3. `tryAcquire()` : Пытается получить доступ к ресурсу без блокировки потока. Возвращает `true` , если доступ разрешен, и `false` , если доступ запрещен. 4. `tryAcquire(long timeout, TimeUnit unit)` : Пытается получить доступ к ресурсу в течение указанного времени. Возвращает `true` , если доступ разрешен, и `false` , если доступ запрещен. Пример использования семафора в Java: import java.util.concurrent.Semaphore; public class SemaphoreExample { public static void main(String[] args) { Semaphore semaphore = new Semaphore(2); // Создание семафора с количеством разрешений 2 // Потоки запрашивают доступ к ресурсу Thread thread1 = new Thread(() -> { try { semaphore.acquire(); System.out.println("Поток 1 получил доступ"); Thread.sleep(2000); // Имитация работы с ресурсом semaphore.release(); System.out.println("Поток 1 освободил доступ"); } catch (InterruptedException e) { e.printStackTrace(); } }); Thread thread2 = new Thread(() -> { try { semaphore.acquire(); System.out.println("Поток 2 получил доступ"); Thread.sleep(2000); // Имитация работы с ресурсом semaphore.release(); System.out.println("Поток 2 освободил доступ"); } catch (InterruptedException e) { e.printStackTrace(); } }); thread1.start(); thread2.start(); } } В этом примере у нас есть семафор с двумя разрешениями. Два потока запрашивают доступ к ресурсу с помощью метода `acquire()` , выполняют некоторую работу и освобождают доступ с помощью метода `release()` . Поскольку у нас есть только два разрешения, оба потока могут получить доступ к ресурсу одновременно. Если бы у нас было только одно разрешение, один из потоков должен был бы ждать, пока другой поток не освободит доступ. Таким образом, семафор позволяет нам контролировать доступ к ресурсам и ограничивать количество потоков, которые могут одновременно получить доступ.


Копировать ссылку