Метод unlock
Метод unlock класса Lock освобождает блокировку,
которая была ранее захвачена с помощью метода lock.
Метод не принимает параметров и не возвращает значения.
Он вызывается из потока, который владеет блокировкой,
и снимает её, позволяя другим потокам войти в защищённую секцию.
Если вызвать unlock из потока, который не владеет
блокировкой, будет выброшено исключение
IllegalMonitorStateException.
Метод unlock обычно вызывается в блоке
finally, чтобы гарантировать освобождение блокировки
даже при возникновении исключения.
Синтаксис
lock.unlock()
Пример
Давайте захватим блокировку, выполним действие и освободим
её через unlock:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Main
{
public static void main(String[] args)
{
Lock lock = new ReentrantLock();
lock.lock();
try
{
System.out.println("Locked");
}
finally
{
lock.unlock();
}
System.out.println("Unlocked");
}
}
Результат выполнения кода:
"Locked"
"Unlocked"
Пример
Давайте проверим, что после вызова unlock другой поток
может захватить ту же блокировку:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
Lock lock = new ReentrantLock();
Thread t1 = new Thread(() -> {
lock.lock();
try
{
System.out.println("Thread 1 locked");
}
finally
{
lock.unlock();
}
});
Thread t2 = new Thread(() -> {
lock.lock();
try
{
System.out.println("Thread 2 locked");
}
finally
{
lock.unlock();
}
});
t1.start();
t1.join();
t2.start();
t2.join();
}
}
Результат выполнения кода:
"Thread 1 locked"
"Thread 2 locked"
Смотрите также
-
метод
lock,
который захватывает блокировку -
метод
tryLock,
который пытается захватить блокировку без ожидания -
класс
ReentrantLock,
который реализует интерфейс Lock -
метод
synchronized,
который обеспечивает встроенную синхронизацию