РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1016 of 1163 menu

Метод 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,
    который представляет реентерабельную блокировку
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить