锁专题(六)这么用心的可重入读写锁讲解,不给作者点个赞吗?( 五 )

公平与非公平的区别清单13:公平下的Syncstatic final class FairSync extends Sync {private static final long serialVersionUID = -2274990926593161451L;final boolean writerShouldBlock() {return hasQueuedPredecessors(); // 队列中是否有元素 , 有则当前操作需要block}final boolean readerShouldBlock() {return hasQueuedPredecessors();// 队列中是否有元素 , 有则当前操作需要block}}公平下的Sync实现策略是所有获取的读锁或者写锁的线程都需要入队排队 , 按照顺序依次去尝试获取锁 。
清单14:非公平下的Syncstatic final class NonfairSync extends Sync {private static final long serialVersionUID = -8159625535654395037L;final boolean writerShouldBlock() {// 非公平下不考虑排队 , 因此写锁可以竞争获取return false; // writers can always barge}final boolean readerShouldBlock() {/* As a heuristic to avoid indefinite writer starvation,* block if the thread that momentarily appears to be head* of queue, if one exists, is a waiting writer.This is* only a probabilistic effect since a new reader will not* block if there is a waiting writer behind other enabled* readers that have not yet drained from the queue.*/// 这里实际上是一个优先级 , 如果队列中头部元素时写锁 , 那么读锁需要等待 , 避免写锁饥饿 。return apparentlyFirstQueuedIsExclusive();}}非公平下由于抢占式获取锁 , 写锁是可能产生饥饿 , 因此解决办法就是提高写锁的优先级 , 换句话说获取写锁之前先占坑 。
小结本文回顾了可重入锁 ReentrantLock , 引入了读场景多时性能更加优异的可重入读写锁 ReentrantReadWriteLock 。
从类的介绍使用 , 深入到源码解析 , 希望给各位极客们带来全面的认识 。 下一节我们将一起学习下比 ReentrantReadWriteLock 性能更好的锁 , 你知道是什么吗?
希望本文对你有帮助 , 如果有其他想法的话 , 也可以评论区和大家分享哦 。
各位极客的点赞收藏转发 , 是老马写作的最大动力!
锁专题(六)这么用心的可重入读写锁讲解,不给作者点个赞吗?文章插图
深入学习