Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования