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

Метод lock

Метод lock класса ReentrantLock используется для захвата блокировки. Если блокировка в данный момент удерживается другим потоком, текущий поток будет заблокирован до тех пор, пока блокировка не будет освобождена. Метод не принимает параметров и не возвращает значения. Важно, что после выполнения критической секции блокировку необходимо освободить с помощью метода unlock.

Синтаксис

lock.lock();

Пример

Давайте рассмотрим простой пример, где два потока увеличивают общий счетчик, используя ReentrantLock для синхронизации:

import java.util.concurrent.locks.ReentrantLock; public class Main { private static int counter = 0; private static final ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) throws InterruptedException { Runnable task = () -> { for (int i = 0; i < 1000; i++) { lock.lock(); try { counter++; } finally { lock.unlock(); } } }; Thread t1 = new Thread(task); Thread t2 = new Thread(task); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(counter); } }

Результат выполнения кода:

2000

Пример

Давайте посмотрим, как метод lock ведет себя, когда один поток уже удерживает блокировку, а другой пытается ее захватить:

import java.util.concurrent.locks.ReentrantLock; public class Main { public static void main(String[] args) throws InterruptedException { ReentrantLock lock = new ReentrantLock(); Thread t1 = new Thread(() -> { lock.lock(); try { System.out.println("Thread 1 locked"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } finally { lock.unlock(); System.out.println("Thread 1 unlocked"); } }); Thread t2 = new Thread(() -> { System.out.println("Thread 2 waiting"); lock.lock(); try { System.out.println("Thread 2 locked"); } finally { lock.unlock(); } }); t1.start(); Thread.sleep(100); t2.start(); t1.join(); t2.join(); } }

Результат выполнения кода:

Thread 1 locked Thread 2 waiting Thread 1 unlocked Thread 2 locked

Смотрите также

  • метод unlock,
    который освобождает блокировку
  • метод tryLock,
    который пытается захватить блокировку без ожидания
  • класс ReentrantLock,
    который представляет повторно входимую блокировку
  • интерфейс Lock,
    который описывает базовые операции блокировки
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить