РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1032 of 1163 menu

Метод 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,
    который реализует альтернативный механизм блокировки
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить