Что даёт оптимистичное чтение в StampedLock и о каком его ограничении важно помнить?
tryOptimisticRead даёт метку, данные читаются без блокировки, затем validate проверяет, не было ли записи; не прошла — повтор или обычная блокировка чтения. Ограничения: данные между меткой и проверкой могут быть несогласованными, и StampedLock не реентерабелен.
- Значения сначала копируют в локальные переменные, потом validate, потом используют
- Нет Condition
- При преобладании чтения почти без накладных расходов
А ещё Повторный захват тем же потоком — взаимоблокировка с самим собой
Подробно
Выигрыш в том, что при преобладании чтений накладные расходы почти исчезают: не нужно даже атомарно инкрементировать счётчик читателей, как в ReentrantReadWriteLock. Но пользоваться этим надо аккуратно: между получением метки и проверкой данные могут быть несогласованными, поэтому их сначала копируют в локальные переменные и только потом валидируют, а любые побочные эффекты до проверки недопустимы. Ограничения существенные: StampedLock не реентерабелен — повторный захват тем же потоком приведёт к самоблокировке; он не поддерживает Condition; и он не является Lock, поэтому не сочетается с привычными идиомами. Это специализированный инструмент для узких мест с преобладанием чтения, а не замена ReentrantReadWriteLock по умолчанию.
Что хотят услышать
- Схема оптимистичного чтения.
- Копирование перед validate.
- Нереентерабельность.
Частые ошибки
- Использовать прочитанные данные до вызова validate.
- Захватывать StampedLock повторно в том же потоке.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Чтение без какой-либо проверки всегда возвращает согласованные данные
- ✓Чтение без захвата с проверкой validate; лок не реентерабелен
- ✗Писатели никогда не блокируют читателей, а читатели — писателей
- ✗StampedLock полностью заменяет ReentrantReadWriteLock во всех сценариях
Что спросят дальше
- Почему ReentrantReadWriteLock проигрывает при большом числе читателей?
- Что произойдёт при рекурсивном захвате StampedLock?
Разбор темы
- Явные блокировки: ReentrantLock, RW и Condition
Когда synchronized мало, ReentrantLock с tryLock/fairness, ReadWriteLock и StampedLock, Condition вместо wait/notify.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.