Получить доступ

Какие возможности даёт ReentrantLock, недоступные при использовании synchronized?

MiddleМногопоточность
Ещё спрашивают так:
  • Чем ReentrantLock отличается от synchronized?
Коротко

ReentrantLock добавляет tryLock (с таймаутом), lockInterruptibly, справедливый режим и несколько Condition. Цена — освобождение вручную: lock() перед try, unlock() в finally.

  • synchronized отпускается сам при любом выходе, включая исключение
  • Оба реентерабельны
  • Простая критическая секция — synchronized читается лучше

А ещё ReadWriteLock и StampedLock — для преобладающих чтений

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Именно автоматическое освобождение остаётся преимуществом synchronized: монитор отпускается при любом выходе из блока, включая исключение. У ReentrantLock это обязанность программиста, отсюда железная идиома — lock() перед try, unlock() в finally; ошибка здесь даёт вечно удерживаемую блокировку. Возможность tryLock с таймаутом принципиально важна для борьбы с взаимными блокировками: поток может отступить и повторить попытку вместо бесконечного ожидания. Несколько Condition позволяют раздельно будить, скажем, читателей и писателей, тогда как у монитора очередь ожидания одна. При этом по производительности в современных JVM разница невелика, поэтому по умолчанию берут synchronized и переходят на явную блокировку ради конкретной возможности.

Что хотят услышать

  • Возможности сверх synchronized.
  • Обязательный unlock в finally.
  • Когда выбирать что.

Частые ошибки

  • Забыть unlock в finally.
  • Включать справедливый режим по умолчанию — он заметно снижает пропускную способность.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓tryLock() — попытка захвата без блокирования, в том числе с таймаутом
  • ✓lockInterruptibly() — ожидание блокировки, прерываемое через interrupt()
  • ✓Справедливый режим и несколько независимых Condition на одну блокировку
  • ✗Автоматическое освобождение блокировки при выходе из блока

Что спросят дальше

  • Почему справедливый режим снижает пропускную способность?
  • Чем ReadWriteLock отличается от StampedLock?
  • Что такое Condition?
  • Что значит reentrant lock?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем