Чем StampedLock опаснее ReentrantReadWriteLock

Вопрос проверяет, понимаете ли вы разницу между блокировкой и версионированием доступа. StampedLock не реентерабелен — если поток повторно захватит ту же блокировку, которую уже держит, он встанет в дедлок сам с собой. ReentrantReadWriteLock такого не допускает по конструкции.

Оптимистичное чтение через tryOptimisticRead() не блокирует вообще — оно просто возвращает штамп. Дальше нужно вручную проверить штамп через validate() после чтения данных, и если он не совпал — повторить попытку уже с обычным readLock(). Забыли проверку — читаете неконсистентные данные молча, без исключения.

long stamp = lock.tryOptimisticRead(); int localX = x; int localY = y; if (!lock.validate(stamp)) { stamp = lock.readLock(); try { localX = x; localY = y; } finally { lock.unlockRead(stamp); } }

Спросят следом: что будет, если внутри optimistic-блока вызвать метод, который сам пытается взять lock повторно. Ответ — поток заблокирует себя, потому что StampedLock не отличает «тот же поток» от «другой поток», у него нет понятия владельца блокировки.

Blocking-блокировка хотя бы честно останавливает вас на входе. Optimistic read останавливает только на выходе — и то если не забыли validate().

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки