ReentrantLock源码分析
因为在学习ReentrantLock源码的过程中发现网上相关文章的源码都比较老了,所以写了这篇文章。
本文中提到的源码均为jdk17中的源码
我们先看ReentrantLock中常用的几个关键的方法
1 | public void lock() { |
1 | public void unlock() { |
都是通过ReentrantLock内部的sync实现的,而Sync是ReentrantLock是中实现了AbstractQueuedSynchronizer的一个内部类,Sync的主要子类有NonfairSync
,FairSync
。
具体关系如下
我们先看Sync
1 | abstract static class Sync extends AbstractQueuedSynchronizer { |
我们主要关注的就是lock
和tryRelease
方法
- lock方法主要通过initialTryLock CAS尝试修改state,如果修改成功的话就设置线程独占。失败的话就调用acquire加入到等待队列当中。
- 最终AQS中的acquire会调用tryAcquire,这个方法会尝试去获取资源。
- tryRelease 会减少重入的次数,当state为0时,最终就会释放独占的线程。
NonfairSync
,FairSync
中是否公平的也是通过实现initialTryLock
和tryAcquire
实现的NonfairSync
的源码如下
1 | static final class NonfairSync extends Sync { |
发现我们上文提到的initialTryLock
和tryAcquire
最终都在这里实现了。
而NonfairSync
,FairSync
区别其实就是在将自己设为独占线程之前判断等待队列中是否存在在自己之前的线程在等待该资源。
1 | //NonfairSync 设置独占线程之前的判断,不会去判断是否存在别的线程在等待 |
最终调用流程