CodeWalk

StampedLock乐观读锁原理

作者:屠龙少年 · 2026-05-30 12:55

请说明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)。

缺点

  • 不可重入。
  • 乐观读后需验证,有额外开销。

适用场景:读多写少,数据一致性不需要严格实时的场景。