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