Метод tryLock
Метод tryLock класса ReentrantLock пытается захватить блокировку.
В отличие от метода lock, который блокирует поток до тех пор,
пока блокировка не будет получена, tryLock немедленно возвращает
результат: true, если блокировка была захвачена, и false,
если блокировка занята другим потоком.
Метод имеет две перегрузки. Первая не принимает параметров и сразу возвращает результат попытки захвата. Вторая принимает первым параметром время ожидания, а вторым - единицу измерения времени. В этом случае поток будет ждать освобождения блокировки в течение указанного времени.
Синтаксис
lock.tryLock()
lock.tryLock(timeout, unit)
Пример
Давайте создадим блокировку и попробуем захватить её из основного потока:
import java.util.concurrent.locks.ReentrantLock;
public class Main
{
public static void main(String[] args)
{
ReentrantLock lock = new ReentrantLock();
boolean res = lock.tryLock();
System.out.println(res);
lock.unlock();
}
}
Результат выполнения кода:
true
Пример
Давайте попробуем захватить блокировку, которая уже занята другим потоком:
import java.util.concurrent.locks.ReentrantLock;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
ReentrantLock lock = new ReentrantLock();
Thread thread = new Thread(() -> {
lock.lock();
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
}
});
thread.start();
Thread.sleep(100);
boolean res = lock.tryLock();
System.out.println(res);
thread.join();
}
}
Результат выполнения кода:
false
Пример
Давайте используем перегрузку с таймаутом, чтобы подождать освобождения блокировки в течение двух секунд:
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
ReentrantLock lock = new ReentrantLock();
Thread thread = new Thread(() -> {
lock.lock();
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
}
});
thread.start();
Thread.sleep(100);
boolean res = lock.tryLock(2, TimeUnit.SECONDS);
System.out.println(res);
if (res)
{
lock.unlock();
}
thread.join();
}
}
Результат выполнения кода:
true
Смотрите также
-
метод
lock,
который блокирует поток до захвата блокировки -
метод
unlock,
который освобождает блокировку -
метод
lockInterruptibly,
который блокирует поток с возможностью прерывания -
класс
ReentrantLock,
который представляет реентерабельную блокировку