StampedLock
About 1 min
我们知道ReadWriteLock可以实现读写分离,但是读写之间仍旧是需要同步的。当有大量的读线程,那么也会造成写线程的长时间阻塞引发饥饿的问题。有没有一种锁可以针对这种场景做些优化呢?今天我们就来看下这个作为读写锁的升级版:StampedLock
使用
StampedLock
提供了一种乐观的读策略。这种乐观的锁非常类似无锁的操作,使得乐观锁完全不会阻塞写线程。
分析
StampedLock
的内部实现是基于CLH锁的。CLH锁是一种自旋锁,它保证没有饥饿发生,并且可以保证FIFO的服务顺序。
CLH锁的基本思想如下:锁维护一个等待线程队列,所有申请锁但是没有成功的线程都记录在这个队列中。每一个节点(一个节点代表一个线程),保存一个标记位(locked)用于判断当前线程是否已经持有锁。
当一个线程试图获得锁时,取得当前等待队列的尾部节点作为其前序节点,并使用类似如下代码判断前序节点是杏已经成功释放锁
while (pred.locked) {}
FAQ
总结
StampedLock
提供了乐观读锁,可取代ReadWriteLock
以进一步提升并发性能StampedLock
是不可重入锁