知识卡片
乐观读必须验证快照
内容
StampedLock 对 [[读写锁看比例]] 做了改进,提供三种模式:悲观读锁(多线程共享)、写锁(与悲观读互斥)、乐观读(tryOptimisticRead(),不加锁直接读,返回印戳)。正确用法三步:取印戳、读数据、validate(stamp) 校验——失败说明期间被写锁抢占,须退化为悲观读。它还不可重入,重复获取会死锁,适合读短、冲突低的场景。
参考来源
- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第5章《JUC显式锁的原理与实战》5.6.3节《StampedLock》(源文件:_epub-src/OEBPS/Text/chapter181.xhtml);JDK 官方文档核实乐观读语义与不可重入限制([JDK StampedLock](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/StampedLock.html))。
- 结论依据:原文明确“乐观读锁:相当于直接操作数据,不加任何锁,连读锁都不要”,并在演示代码中给出完整三步流程——`tryOptimisticRead()`获取印戳、读取数据、`validate(stamp)`校验,校验失败时“写锁已经被抢占,进入了写锁模式,只能通过悲观读锁再一次读取最新值”,因此推出本卡结论。
- 原始内容:乐观读锁:相当于直接操作数据,不加任何锁,连读锁都不要……乐观读操作已经间隔了一段时间,期间可能发生写入,所以,需要验证乐观读的印戳值是否有效,即判断LOCK是否进入过写模式……乐观读的印戳值无效,表明写锁被占用过……只能通过悲观读锁再一次读取最新值。