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

Что даёт оптимистичное чтение в StampedLock и о каком его ограничении важно помнить?

SeniorМногопоточность
Коротко

tryOptimisticRead даёт метку, данные читаются без блокировки, затем validate проверяет, не было ли записи; не прошла — повтор или обычная блокировка чтения. Ограничения: данные между меткой и проверкой могут быть несогласованными, и StampedLock не реентерабелен.

  • Значения сначала копируют в локальные переменные, потом validate, потом используют
  • Нет Condition
  • При преобладании чтения почти без накладных расходов

А ещё Повторный захват тем же потоком — взаимоблокировка с самим собой

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

Подробно

Выигрыш в том, что при преобладании чтений накладные расходы почти исчезают: не нужно даже атомарно инкрементировать счётчик читателей, как в ReentrantReadWriteLock. Но пользоваться этим надо аккуратно: между получением метки и проверкой данные могут быть несогласованными, поэтому их сначала копируют в локальные переменные и только потом валидируют, а любые побочные эффекты до проверки недопустимы. Ограничения существенные: StampedLock не реентерабелен — повторный захват тем же потоком приведёт к самоблокировке; он не поддерживает Condition; и он не является Lock, поэтому не сочетается с привычными идиомами. Это специализированный инструмент для узких мест с преобладанием чтения, а не замена ReentrantReadWriteLock по умолчанию.

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

  • Схема оптимистичного чтения.
  • Копирование перед validate.
  • Нереентерабельность.

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

  • Использовать прочитанные данные до вызова validate.
  • Захватывать StampedLock повторно в том же потоке.

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

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Чтение без захвата блокировки с последующей проверкой validate: если писатель вмешался, данные перечитывают. StampedLock не реентерабелен
  • ✗Чтение всегда возвращает согласованные данные без какой-либо проверки
  • ✗Писатели никогда не блокируют читателей, а читатели — писателей
  • ✗StampedLock полностью заменяет ReentrantReadWriteLock во всех сценариях

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

  • Почему ReentrantReadWriteLock проигрывает при большом числе читателей?
  • Что произойдёт при рекурсивном захвате StampedLock?

Разбор темы

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

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

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

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

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