Какие возможности даёт ReentrantLock, недоступные при использовании synchronized?
- Чем ReentrantLock отличается от synchronized?
ReentrantLock добавляет tryLock (с таймаутом), lockInterruptibly, справедливый режим и несколько Condition. Цена — освобождение вручную: lock() перед try, unlock() в finally.
- synchronized отпускается сам при любом выходе, включая исключение
- Оба реентерабельны
- Простая критическая секция — synchronized читается лучше
А ещё ReadWriteLock и StampedLock — для преобладающих чтений
Подробно
Именно автоматическое освобождение остаётся преимуществом synchronized: монитор отпускается при любом выходе из блока, включая исключение. У ReentrantLock это обязанность программиста, отсюда железная идиома — lock() перед try, unlock() в finally; ошибка здесь даёт вечно удерживаемую блокировку. Возможность tryLock с таймаутом принципиально важна для борьбы с взаимными блокировками: поток может отступить и повторить попытку вместо бесконечного ожидания. Несколько Condition позволяют раздельно будить, скажем, читателей и писателей, тогда как у монитора очередь ожидания одна. При этом по производительности в современных JVM разница невелика, поэтому по умолчанию берут synchronized и переходят на явную блокировку ради конкретной возможности.
Что хотят услышать
- Возможности сверх synchronized.
- Обязательный unlock в finally.
- Когда выбирать что.
Частые ошибки
- Забыть unlock в finally.
- Включать справедливый режим по умолчанию — он заметно снижает пропускную способность.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓tryLock() — попытка захвата без ожидания или с таймаутом
- ✓lockInterruptibly() — ожидание, прерываемое через interrupt()
- ✗Автоматическое освобождение блокировки при выходе из блока, даже если unlock() не вызван
- ✓Справедливый режим и несколько Condition на одну блокировку
Что спросят дальше
- Почему справедливый режим снижает пропускную способность?
- Чем ReadWriteLock отличается от StampedLock?
- Что такое Condition?
- Что значит reentrant lock?
Разбор темы
- Явные блокировки: ReentrantLock, RW и Condition
Когда synchronized мало, ReentrantLock с tryLock/fairness, ReadWriteLock и StampedLock, Condition вместо wait/notify.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.