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