上一篇:
JUC中的读写锁(ReentrantReadWriteLock)
之前我们了解了 ReentrantReadWriteLock,ReentrantReadWriteLock虽然在多线程的读操作中有比较好的性能,但是它有一个明显的缺点:读锁会阻塞住写锁。这样会导致当读操作非常频繁时,写锁可能会被一直阻塞,无法及时完成写入操作。
为了解决这个问题,在Java8中又引入了StampedLock
StampedLock
StampedLock 的名字源于“邮戳”(Stamp),可以理解为给锁加了一个标记或版本号。因此,StampedLock 就是一种带有标记(版本号)的锁。
StampedLock同样支持读写锁,但是比ReentrantReadWriteLock中的读锁多了一个特性是StampedLock中的读锁可以是乐观锁
乐观锁实际上是不加锁的,只是记录一下当前的版本号,不会阻塞住写锁,乐观的认为读的时候没有写的操作。所以,乐观锁在读的过程中,写锁是可以执行的。
这个特性使得 StampedLock 在读操作非常频繁而写操作较少的情况下,性能更优,因为它避免了写锁的长时间等待。
我们先来看看StampedLock中的方法