StampedLock 原理
StampedLock 是 JDK 8 引入的高性能锁,提供了三种锁模式:写锁、悲观读锁和乐观读锁。相比 ReentrantReadWriteLock,StampedLock 的读操作更轻量,特别适合读多写少且写冲突不多的场景。
三种锁模式
StampedLock 的核心思想
乐观读 vs 悲观读
核心思想:乐观读假设在读取期间没有写操作发生,因此不需要加锁。如果发现数据被修改,再采取补救措施。
基本用法
乐观读模式
完整示例
stamp 机制
stamp 的含义
- stamp = 0:获取锁失败
- stamp > 0:乐观读或读锁stamp,需要通过
validate(stamp)验证 - stamp < 0:写锁stamp,需要用
unlockWrite(stamp)释放
stamp 的优势
相比 ReentrantReadWriteLock,stamp 的优势:
- 不需要记录重入次数:stamp 本身就代表了锁状态
- 验证简单:
validate(stamp)一行代码 - 支持锁降级:可以从写锁降级到读锁
锁升级
乐观读 → 悲观读
乐观读 → 写锁
读锁 → 写锁
适用场景
适合的场景
- 读多写少:读操作远多于写操作
- 写冲突少:写操作之间冲突不多
- 读操作简单:读取操作本身很快
不适合的场景
- 写冲突频繁:乐观读会频繁失败
- 读操作复杂:读取本身耗时较长
- 需要重入:StampedLock 不支持重入
StampedLock vs ReentrantReadWriteLock
对比
性能对比
注意事项
不支持重入
不是公平锁
StampedLock 默认是非公平锁,但可以通过构造方法改为公平模式:
线程中断
StampedLock 的 readLockInterruptibly() 和 writeLockInterruptibly() 支持可中断获取。
实战案例
高性能缓存
本章总结
核心要点:
- 三种锁模式:写锁、悲观读锁、乐观读锁
- 乐观读:不阻塞,通过 stamp 验证,适合读多写少
- stamp 机制:stamp > 0 表示有效,需要 validate() 验证
- 锁升级:支持乐观读→悲观读、乐观读→写锁、读锁→写锁
- 不支持重入:同一线程不能多次获取同一锁
- 性能优势:乐观读无 CAS、无阻塞开销
StampedLock 是读多写少场景的高性能选择。下一节我们将讲解 CAS 与原子类。