概述
StampedLock
是基于能力的锁,用三种模式来控制读/写访问。StampedLock
的状态包含了 版本和模式。锁获取方法根据锁的状态返回一个表示和控制访问的标志(stamp),“try”版本的这些方法可能返回一个特殊的值 0
来表示获取失败。锁释放和它的变换方法要求一个标志作为参数,如果它们不符合锁的状态就失败。这三种模式是:
-
写:方法
writeLock
可能阻塞等待独占访问,返回一个标志,可用在方法unlockWrite
以释放锁。也提供了无时间和带时间版本的tryWriteLock
方法。当锁以写模式持有时,没有读锁可以获取,所有乐观性读确认将失败。 -
读:方法
readLock
可能为非独占访问而阻塞等待,返回一个标志用于方法unlockRead
以释放锁。也提供了无时间和带时间版本的tryWriteLock
方法。 -
乐观读:只有在锁当前没有以写模式持有时,方法
tryOptimisticRead
返回一个非0
标志。如果锁自给定标志以来没有以写模式持有,方法validate
返回true
。这种模式可以认为是一种极弱版本的读锁,可以在任意时间被写者打破。在短的只读代码段使用乐观模式常常可以减少竞争和提升吞吐量。然而,它的使用天生是脆弱的。乐观读片段section应该只读字段并持有到本地变量,用于以后使用,在确认以后。乐观读模式里的字段读取可能很不一致,所以惯例只用于当你对数据表示足够熟悉,可以检查一致性和/或重复调用validate()
方法。例如,这些步骤典型地在第一次读取对象或数组引用,然后访问其中字段、元素或方法时要求。