StampedLock乐观读锁原理
请说明StampedLock(JDK8新增)相比ReentrantReadWriteLock的优势,以及乐观读锁的工作原理。
回答
屠龙少年
StampedLock特点:
- 三种模式:写锁、悲观读锁、乐观读锁。
- 所有锁返回一个stamp(戳),释放锁时需要传入stamp验证。
- 不可重入。
乐观读锁(Optimistic Read):
- 不加锁,直接读取数据。
- 每次读时获取当前stamp,读取后检查stamp是否变化。
- 如果stamp未变→读过程中没有写操作,数据一致。
- 如果stamp变化→升级为悲观读锁重新读取。
- 完全无锁的读操作,但需要事后验证。
代码示例:
StampedLock lock = new StampedLock();
long stamp = lock.tryOptimisticRead();
int data = sharedData;
if (!lock.validate(stamp)) {
stamp = lock.readLock();
try { data = sharedData; }
finally { lock.unlockRead(stamp); }
}
优势:
- 乐观读完全不加锁,读写互不阻塞,读性能极高。
- ReentrantReadWriteLock在读时阻塞写,可能导致写饥饿。
- StampedLock支持读转写(tryConvertToWriteLock)。
缺点:
- 不可重入。
- 乐观读后需验证,有额外开销。
适用场景:读多写少,数据一致性不需要严格实时的场景。