Метод 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,
который описывает базовые операции блокировки