Метод 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