锁专题(六)这么用心的可重入读写锁讲解,不给作者点个赞吗?( 五 )
公平与非公平的区别清单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 性能更好的锁 , 你知道是什么吗?
希望本文对你有帮助 , 如果有其他想法的话 , 也可以评论区和大家分享哦 。
各位极客的点赞收藏转发 , 是老马写作的最大动力!
文章插图
深入学习
- 苹果|iPhone13迎来变化!或回归指纹解锁,这几点备受用户喜爱
- 最新|2020年12月最新购机推荐,这六款各有优点,实用党首选
- 最多|用户最多的中国APP:拼多多第六,淘宝第二,榜首用户超12亿
- 自动任务|赶在三星 S21 发布之前实现语音解锁
- 东六环|250吨“大块头”入井 东六环改造工程将进入盾构阶段
- 合作|六国合作!澜湄水资源合作信息共享平台网站开通
- 线下连锁商|暴涨130%!荷兰、西班牙、比利时百年商超在考拉海购逆势增长
- 长安街|北京 长安街西城段将来单车无法落锁
- 浅谈如何开好一家手机维修店(六):指南舟手机维修培训学校
- 三头六臂钛强悍 映众RTX3060TI显卡首发