上一篇学习了非公平锁,本节来看看公平锁的实现
公平锁在创建对象时候需要添加一个参数,true
![](https://img.haomeiwen.com/i5391652/46e6d01a3ee37f3b.png)
lock方法此时调用的是公平锁的lock方法,然后内部又调用了acquire()方法
![](https://img.haomeiwen.com/i5391652/4a0b0d38beba053a.png)
这里又调用了公平锁的tryAcquire
![](https://img.haomeiwen.com/i5391652/e22060f1f7b6ed68.png)
这里与非公平锁的唯一区别是在获取锁的时候首先调用的是hasQueuedPredecessors(),而非公平锁这里调用的则是后面的CAS尝试去修改状态。这也就是上文中说的公平与非公平锁的区别体现在这里。
![](https://img.haomeiwen.com/i5391652/7825b94b21716a78.png)
这个方法很简单,就是看现在有没有等待线程的node链条,如果没有则体现在头和尾不相等,且头的下一个node节点null或者不为null时候下一个节点的线程不是当前线程,此时候才回去尝试获取锁
![](https://img.haomeiwen.com/i5391652/cfbba1181e6241e8.png)
其他的方法与非公平锁是一致的,请看我的上一篇文章
JDK8的RentrantLock源码学习--非公平锁:http://www.jianshu.com/p/b1dee032856e
网友评论