Skip to content
Java 并发与锁机制 · 第 6 篇 / 共 9 篇
领域编程与框架
专题Java 专题
当前序列Java 并发与锁机制
阅读位置第 6 篇 / 共 9 篇当前专题第 3 个序列 / 共 10 个序列

StampedLock 怎么理解:乐观读、悲观读和写锁适合什么场景

StampedLock 经常会和:

  • synchronized
  • ReentrantLock
  • ReentrantReadWriteLock

一起出现。

但它真正想解决的问题,并不是“再来一把更复杂的锁”,而是:

  • 在读多写少场景里,把读开销再往下降一点

先说结论

StampedLock 最值得关注的能力是:

  • 乐观读
  • 悲观读
  • 写锁

它更适合:

  • 读远多于写
  • 允许先读后校验
  • 对性能比较敏感的共享状态读取

但它也有明显边界:

  • 使用复杂度更高
  • 不是可重入锁
  • 用错更容易出 bug

一、它和读写锁的差别在哪里

传统读写锁的思路是:

  • 读读可以并行
  • 读写互斥
  • 写写互斥

StampedLock 在这个基础上又多了一层:

  • 乐观读

也就是说,它允许某些读操作先不真正加悲观读锁,而是:

  • 先拿一个版本戳
  • 读取数据
  • 再校验读期间有没有写发生

二、乐观读怎么理解

可以先粗略理解成:

  • 先假设这段时间没人改数据
  • 读完后再验证

如果验证通过:

  • 本次读可以认为有效

如果验证失败:

  • 再退回悲观读重来

这在读多写少场景里很有吸引力,因为:

  • 大量读取不一定都要走真正的锁竞争

三、它什么时候比读写锁更有优势

如果一个共享对象满足:

  • 读非常频繁
  • 写很少
  • 读取逻辑很短

那乐观读带来的收益会比较明显。

典型场景例如:

  • 坐标位置读取
  • 运行状态快照
  • 配置快照读取

四、为什么它不是所有场景都适合

1. 它不是可重入锁

这点非常重要。

如果你按 ReentrantLock 的思路去写,很容易踩坑。

2. API 使用复杂度更高

尤其是:

  • 乐观读校验
  • 锁升级
  • 锁释放时机

如果代码团队对并发模型不够熟,反而更容易出错。

3. 不是所有读多写少都值得上它

很多普通业务里,ReentrantReadWriteLock 已经足够了。

五、一个更实际的选择顺序

1. 普通互斥逻辑

先看:

  • synchronized
  • ReentrantLock

2. 明确读多写少

再看:

  • ReentrantReadWriteLock

3. 读非常频繁,且你能接受更复杂的并发实现

再考虑:

  • StampedLock

六、几个容易踩的坑

1. 把它当成读写锁平替

它们有交集,但设计重点并不完全相同。

2. 乐观读后忘记校验

那就失去了安全边界。

3. 复杂业务逻辑里滥用乐观读

如果读逻辑太长、太复杂,乐观读失败率可能很高,收益也会下降。

一句话总结

StampedLock 的价值不在于“新锁”,而在于它为读多写少场景提供了乐观读这条更轻的路径。

但它更像进阶工具,不是所有团队、所有业务都需要优先使用。

延伸阅读相关文章优先当前专题,再补跨专题关联。
同一序列 · 顺着当前主线继续读CountDownLatch、CyclicBarrier、Semaphore 怎么选适合沿着 JUC、volatile、CAS、AQS 和锁实现这条主线往下看。Java 专题 · Java 并发与锁机制同一序列 · 顺着当前主线继续读BlockingQueue 和生产者消费者模型适合沿着 JUC、volatile、CAS、AQS 和锁实现这条主线往下看。Java 专题 · Java 并发与锁机制同专题其他序列 · Java 类加载与运行时细节对象是在堆上分配还是在栈上逃逸适合把类加载、双亲委派和运行时对象分配放到一起系统看。Java 专题 · Java 类加载与运行时细节同专题其他序列 · Java 类加载与运行时细节双亲委派模型到底解决了什么适合把类加载、双亲委派和运行时对象分配放到一起系统看。Java 专题 · Java 类加载与运行时细节跨专题关联 · 同场景:基础学习@Conditional 系列注解怎么配合使用适合把自动装配、条件装配、Profile 和循环依赖放回 Spring Boot 启动过程里理解。Spring 专题 · Spring Boot 启动、装配与配置跨专题关联 · 同场景:基础学习保留策略和日志压缩适合哪些场景适合把副本机制、acks、批量压缩和日志组织放在一条 Kafka 投递主线上理解。Kafka 专题 · Kafka 投递链路与日志存储机制
继续阅读Java 并发与锁机制当前序列第 6 篇 / 共 9 篇当前专题第 3 个序列 / 共 10 个序列
往前看
上一篇ReentrantLock 实战怎么用回到当前序列上一章上一序列Java 集合与容器从第 1 篇开始:Java 集合怎么选
往后看
下一篇CountDownLatch、CyclicBarrier、Semaphore 怎么选继续当前序列下一章下一序列Java 线程池与异步编排从第 1 篇开始:线程池参数怎么配

把零散经验整理成可查、可复用、可持续更新的企业级知识门户