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

Метод unlock

Метод unlock класса ReentrantLock освобождает блокировку, которую ранее захватил текущий поток с помощью метода lock. Метод не принимает параметров и не возвращает значения. Каждому вызову lock должен соответствовать ровно один вызов unlock, иначе блокировка останется удерживаемой или будет освобождена преждевременно. Вызывать метод должен только тот поток, который владеет блокировкой, иначе будет выброшено исключение IllegalMonitorStateException.

Синтаксис

lock.unlock()

Пример

Давайте захватим блокировку, выполним увеличение счётчика и освободим блокировку:

import java.util.concurrent.locks.ReentrantLock; public class Main { public static void main(String[] args) { ReentrantLock lock = new ReentrantLock(); int counter = 0; lock.lock(); try { counter++; System.out.println(counter); } finally { lock.unlock(); } } }

Результат выполнения кода:

1

Пример

Давайте проверим, что после вызова unlock блокировку может захватить другой поток. Сначала освободим блокировку, а затем запросим её повторно:

import java.util.concurrent.locks.ReentrantLock; public class Main { public static void main(String[] args) { ReentrantLock lock = new ReentrantLock(); lock.lock(); try { System.out.println("locked"); } finally { lock.unlock(); } boolean res = lock.tryLock(); System.out.println(res); lock.unlock(); } }

Результат выполнения кода:

"locked" true

Пример

Давайте посмотрим, что произойдёт при попытке освободить блокировку, которая не была захвачена текущим потоком:

import java.util.concurrent.locks.ReentrantLock; public class Main { public static void main(String[] args) { ReentrantLock lock = new ReentrantLock(); try { lock.unlock(); } catch (IllegalMonitorStateException e) { System.out.println("exception"); } } }

Результат выполнения кода:

"exception"

Смотрите также

  • метод lock,
    который захватывает блокировку
  • метод tryLock,
    который пытается захватить блокировку без ожидания
  • метод lockInterruptibly,
    который захватывает блокировку с возможностью прерывания
  • класс ReentrantLock,
    который реализует повторно входимую блокировку
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить