并发编程-可重入锁ReentrantLock的公平和非公平区别在哪里?

之前发布过AQS源码剖析,可以先看看那篇文章。

构造方法

我们先看下构造方法,如果不传默认是非公平的,如果传入true则为公平的。接下来从代码的角度看下两者的区别。

大体结构

ReentrantLock整体实现了lock接口,维护了一个内部类Sync(这个类是继承了AQS的)。当你调用lock方法时(无论是公平还是非公平)其实执行的都是AQS的acquire方法。

所以要想知道两者的区别,就需要看AQS的acquire方法。

acquire方法

AQS使用了模板设计模式,tryAcquire就是需要实现的方法之一,所以要想知道两者区别还要回到ReentrantLock中看tryAcquire方法。

 

tryAcquire方法

这是公平情况下的方法

这是非公平的情况下

2者的区别就是:公平的时候hasQueuedPredecessors方法会判断一下同步队列里边是否有节点,有就不尝试拿锁直接扔进队尾,而不公平的情况下直接尝试拿锁,不成功才会扔进队尾。

总结

公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。
非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。

 

 

© 版权声明
THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发