死磕面试系列——请说出读写锁的公平锁和非公平锁特点及其原理

190 阅读2分钟

1. 问

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

2. 解析

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

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

3. 答

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

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

4. 扩展

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

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

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

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

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

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

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

求关注欢迎大家关注我的B站账号

B站账号

如果内容有帮到你,欢迎大家点赞、收藏 + 关注

学习交流群

交流群