Метод acquire
Метод acquire класса Semaphore захватывает
одно разрешение семафора. Если разрешение доступно,
метод немедленно его забирает и уменьшает внутренний
счетчик семафора на единицу. Если разрешений нет,
вызывающий поток блокируется до тех пор, пока другое
поток не освободит разрешение через метод release
или пока поток не будет прерван. Параметров метод
не принимает. Существует также перегруженная версия
acquire, принимающая количество разрешений
для захвата.
Синтаксис
semaphore.acquire()
Пример
Давайте создадим семафор с двумя разрешениями и захватим одно из них:
import java.util.concurrent.Semaphore;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
Semaphore semaphore = new Semaphore(2);
semaphore.acquire();
System.out.println(semaphore.availablePermits());
}
}
Результат выполнения кода:
1
Пример
Давайте посмотрим, как метод acquire блокирует
поток, когда разрешений нет. Второй поток будет
ждать, пока первый не освободит разрешение:
import java.util.concurrent.Semaphore;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
Semaphore semaphore = new Semaphore(1);
semaphore.acquire();
Thread thread = new Thread(() -> {
try
{
System.out.println("waiting");
semaphore.acquire();
System.out.println("acquired");
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
});
thread.start();
Thread.sleep(100);
System.out.println("releasing");
semaphore.release();
thread.join();
}
}
Результат выполнения кода:
"waiting"
"releasing"
"acquired"
Пример
Давайте захватим сразу два разрешения с помощью
перегруженной версии метода acquire:
import java.util.concurrent.Semaphore;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
Semaphore semaphore = new Semaphore(5);
semaphore.acquire(3);
System.out.println(semaphore.availablePermits());
}
}
Результат выполнения кода:
2
Смотрите также
-
класс
Semaphore,
который управляет доступом к ресурсам -
метод
release,
который освобождает разрешение семафора -
метод
tryAcquire,
который пытается захватить разрешение без блокировки -
класс
ReentrantLock,
который реализует альтернативный механизм блокировки