Метод tryLock
Метод tryLock класса Lock пытается захватить блокировку,
не блокируя поток на неопределённое время. В отличие от метода lock,
который ждёт освобождения блокировки бесконечно, tryLock сразу
возвращает true, если блокировка свободна, и false, если она занята.
Существует две перегрузки метода: без параметров и с параметрами времени
ожидания. В первый вариант параметры не передаются. Во второй вариант
первым параметром передаётся время ожидания, вторым - единица измерения
времени TimeUnit.
Синтаксис
lock.tryLock()
lock.tryLock(timeout, unit)
Пример
Давайте захватим блокировку и проверим результат без ожидания:
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();
boolean res = lock.tryLock();
System.out.println(res);
if (res)
{
lock.unlock();
}
}
}
Результат выполнения кода:
true
Пример
Давайте проверим, что повторный захват уже занятой блокировки
без ожидания вернёт false:
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();
boolean res = lock.tryLock();
System.out.println(res);
lock.unlock();
}
}
Результат выполнения кода:
false
Пример
Давайте захватим блокировку с ожиданием в 1 секунду:
import java.util.concurrent.TimeUnit;
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();
boolean res = lock.tryLock(1, TimeUnit.SECONDS);
System.out.println(res);
if (res)
{
lock.unlock();
}
}
}
Результат выполнения кода:
true
Смотрите также
-
метод
lock,
который захватывает блокировку с ожиданием -
метод
unlock,
который освобождает блокировку -
класс
ReentrantLock,
который является реализацией Lock -
класс
TimeUnit,
который задаёт единицу измерения времени