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