Метод lockInterruptibly
Метод lockInterruptibly класса ReentrantLock
захватывает блокировку, но, в отличие от метода lock,
может быть прерван другим потоком. Если блокировка свободна,
метод сразу её захватывает и возвращает управление. Если
блокировка занята другим потоком, текущий поток переходит
в состояние ожидания до тех пор, пока блокировка не
освободится или пока поток не будет прерван. В случае
прерывания метод выбрасывает исключение
InterruptedException. Параметров метод не принимает.
Синтаксис
lock.lockInterruptibly()
Пример
Давайте захватим блокировку методом lockInterruptibly
в основном потоке и выведем сообщение об успешном захвате:
import java.util.concurrent.locks.ReentrantLock;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
ReentrantLock lock = new ReentrantLock();
lock.lockInterruptibly();
try
{
System.out.println("Lock acquired");
}
finally
{
lock.unlock();
}
}
}
Результат выполнения кода:
"Lock acquired"
Пример
Давайте создадим поток, который захватит блокировку и будет
удерживать её, а второй поток попытается захватить её
методом lockInterruptibly и будет прерван:
import java.util.concurrent.locks.ReentrantLock;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
ReentrantLock lock = new ReentrantLock();
Thread holder = new Thread(() -> {
lock.lock();
try
{
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
}
}
finally
{
lock.unlock();
}
});
holder.start();
Thread.sleep(100);
Thread waiter = new Thread(() -> {
try
{
lock.lockInterruptibly();
try
{
System.out.println("Lock acquired");
}
finally
{
lock.unlock();
}
}
catch (InterruptedException e)
{
System.out.println("Interrupted while waiting");
}
});
waiter.start();
Thread.sleep(200);
waiter.interrupt();
}
}
Результат выполнения кода:
"Interrupted while waiting"
Пример
Давайте убедимся, что после успешного захвата блокировки флаг прерывания не влияет на работу метода, если поток не находится в ожидании:
import java.util.concurrent.locks.ReentrantLock;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
ReentrantLock lock = new ReentrantLock();
Thread.currentThread().interrupt();
lock.lockInterruptibly();
try
{
System.out.println("Acquired, interrupted flag: "
+ Thread.currentThread().isInterrupted());
}
finally
{
lock.unlock();
}
}
}
Результат выполнения кода:
"Acquired, interrupted flag: true"
Смотрите также
-
метод
lock,
который захватывает блокировку без возможности прерывания -
метод
tryLock,
который пытается захватить блокировку без ожидания -
метод
unlock,
который освобождает блокировку -
класс
ReentrantLock,
который представляет повторно входимую блокировку