StampedLock
– примитив синхронизации, добавленный в Java с версии 8. Общий принцип его работы точно такой же, как у ReadWriteLock: захват неэксклюзивной блокировки (на чтение), и эксклюзивной (на запись). Но есть у этих классов ряд различий в деталях.Во-первых, если блокировка
ReadWriteLock
возвращает объекты типа Lock
, то StampedLock
возвращает числа типа long
, которые и называется «штампами». Штамп служит идентификатором лока, он передается параметром в методы по работе с ранее захваченной блокировкой чтения или записи. Специальный штамп 0 означает неудавшийся захват.StampedLock
в отличие от ReentrantReadWriteLock
– не реентрант. Это накладывает бóльшую ответственность на программиста: можно устроить дедлок на одном потоке.В
StampedLock
расширена функциональность. Новые методы с префиксом try*
не висят в ожидании. Методы tryOptimistic*
реализуют оптимистичную блокировку. Методы tryConvert*
дают возможность изменять «уровень» заблокированности: можно попытаться превратить readLock во writeLock, и наоборот.Не смотря на похожесть,
StampedLock
не наследуется от ReadWriteLock
. Но для совместимости в нём предусмотрены методы-адаптеры asReadWriteLock
, asReadLock
и asWriteLock
.Итого, блокировка на штампах решает те же задачи, что ReadWriteLock, но дает больше возможностей и лучшую производительность.