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

Метод lock

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

Синтаксис

lock.lock()

Пример

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

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(); Thread thread1 = new Thread(() -> { lock.lock(); try { System.out.println("Thread 1 locked"); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); System.out.println("Thread 1 unlocked"); } }); Thread thread2 = new Thread(() -> { lock.lock(); try { System.out.println("Thread 2 locked"); } finally { lock.unlock(); System.out.println("Thread 2 unlocked"); } }); thread1.start(); thread2.start(); } }

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

"Thread 1 locked" "Thread 1 unlocked" "Thread 2 locked" "Thread 2 unlocked"

Пример

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

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

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

5000

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

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