欢迎关注公众号 《小姐姐味道》 ,一起进步!

# 请说出读写锁的公平锁和非公平锁特点及其原理

死磕面试系列。

标签:【高级】【Java】

# 1. 问

读写锁里面两个特性,一个公平性,一个读和写。原理是什么样子?

# 2. 解析

说实在的,我也很讨厌面试这种源码级别的问题,没啥鸟用,也考验不出来应聘者的实际水平。懂源码难道就代表技术好?不过bat都是这么面的。所以你只能适应。用面试的话来说就是、筛选一下、懂原理的优先。矮个子里面挑高个子。我觉得还是要以线上优化,线上问题的解决方案,项目的技术架构设计为主要面试目的。

不过话说回来,如果你面的是高级Java,这个不了解,基本上是没戏的。

# 3. 答

公平锁指的是按照线程请求的顺序,来分配锁;而非公平锁指的是不完全按照请求的顺序,在一定情况下,可以允许插队。

公平与否,是由底层的Sync实现的,有FairSync和NonfairSync之分,而Sync是继承的AQS。这两种锁的唯一区别,就是公平锁在获取锁的时候,要先判断等待队列中是否已经有线程排队了。如果有的话,公平锁对应的线程就不再尝试获取锁。

# 4. 扩展

其实,看看代码就知道了,但很多人不会看。因为这个类的行数比较长,很多人就直接放弃了。这里直接贴出关键点来。

接下来可能会面临连环问:

问:是抢占式性能高还是公平的高呢?

答:非公平锁吞吐量搞。抢占式的话你不用在队列里面记录他的顺序、直接开门放闸随便抢,谁抢到是谁的。 公平锁你要记录排队的顺序。所以:公平锁吞吐量会低一些,但非公平锁有可能会发生线程饿死的情况。

问:它们应用场景是什么样子呢?

我们平常使用的锁,是非公平锁。所以只说公平锁的场景。

如果你有顺序性要求,就可以使用公平锁。非要举个例子的话,可以描述下抽奖系统,获取锁,严格按照先后来。

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,​进一步交流。​

http://xjjdog.cn 对200+原创文章进行了细致的分类,阅读更流畅,欢迎收藏。


关注回复 技术 关键字 ,即可 获取 海量资源

鲁ICP备2020043359号-1