Метод 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,
который реализует повторно входимую блокировку