Skip to main content

StampedLock

huhxAbout 1 minjavaConcurrency-ToolkitConcurrency

我们知道ReadWriteLock可以实现读写分离,但是读写之间仍旧是需要同步的。当有大量的读线程,那么也会造成写线程的长时间阻塞引发饥饿的问题。有没有一种锁可以针对这种场景做些优化呢?今天我们就来看下这个作为读写锁的升级版:StampedLock

使用

StampedLock提供了一种乐观的读策略。这种乐观的锁非常类似无锁的操作,使得乐观锁完全不会阻塞写线程。

分析

StampedLock的内部实现是基于CLH锁的。CLH锁是一种自旋锁,它保证没有饥饿发生,并且可以保证FIFO的服务顺序。

CLH锁的基本思想如下:锁维护一个等待线程队列,所有申请锁但是没有成功的线程都记录在这个队列中。每一个节点(一个节点代表一个线程),保存一个标记位(locked)用于判断当前线程是否已经持有锁。

当一个线程试图获得锁时,取得当前等待队列的尾部节点作为其前序节点,并使用类似如下代码判断前序节点是杏已经成功释放锁

while (pred.locked) {}

FAQ

总结

  • StampedLock提供了乐观读锁,可取代ReadWriteLock以进一步提升并发性能
  • StampedLock是不可重入锁

参考