Sobes.tech
Назад к вопросам
Junior — Middle
67

Какое назначение у класса ReentrantLock в Java и в чем его преимущества по сравнению с synchronized?

Компании, где спрашивали
Альфа-БанкАльфа-Банк

Ответ от нейросети

sobes.tech AI

Класс ReentrantLock в Java используется для управления доступом к общим ресурсам в многопоточной среде, обеспечивая механизм блокировки с возможностью повторного захвата (reentrant). Это значит, что поток, уже владеющий блокировкой, может захватить её повторно без взаимной блокировки.

Преимущества ReentrantLock по сравнению с ключевым словом synchronized:

  • Гибкость управления блокировкой: можно явно захватывать и освобождать блокировку, что позволяет реализовывать более сложные сценарии синхронизации.
  • Возможность прерывания ожидания блокировки: метод lockInterruptibly() позволяет потоку прерваться во время ожидания блокировки.
  • Попытка захвата блокировки без ожидания: метод tryLock() позволяет попытаться захватить блокировку и сразу получить результат, не блокируя поток.
  • Поддержка условий (Condition): ReentrantLock предоставляет объекты Condition для более тонкой работы с ожиданием и уведомлением потоков, в отличие от wait()/notify() у synchronized.

Пример использования ReentrantLock:

import java.util.concurrent.locks.ReentrantLock;

public class Counter {
    private final ReentrantLock lock = new ReentrantLock();
    private int count = 0;

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }

    public int getCount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}