Вопрос проверяет знание альтернативы synchronized и возможностей явных блокировок.
ReentrantLock — это явная блокировка из пакета java.util.concurrent.locks.
Он позволяет гибко управлять захватом и освобождением лока.
Поддерживает try-lock и тайм-ауты.
Обеспечивает реентерабельность.
Часто используется там, где synchronized недостаточно гибок.
ReentrantLock предоставляет больше контроля над синхронизацией.
ReentrantLock — это реентерабельная взаимная блокировка с расширенными возможностями управления.
Один и тот же поток может:
захватывать lock несколько раз
обязан освободить его столько же раз
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// критическая секция
} finally {
lock.unlock();
}
tryLock() — попытка захвата без блокировки
tryLock(timeout) — ожидание с тайм-аутом
lockInterruptibly() — реагирование на прерывание
поддержка fairness (справедливости)
сложные сценарии синхронизации
избежание дедлоков
контроль очередности потоков
неблокирующие попытки захвата
ReentrantLock используется там, где требуется более тонкий контроль, чем может дать synchronized.