ReentrantLock源码解析
概括
ReentrantLock,是Lock接口的实现类,我们查看其内的一些方法


我们可以发现其内大部分方法都是通过sync对象来实现的,查看sync:

如上图,sync是一个抽象类,继承了AQS,而AQS的主要实现则是通过一个共享变量以及先进先出的队列实现,如下:
AQS实现

由volatile修饰的state,表示共享资源的状态,当其为0时表示资源空闲,>0时表示资源被锁定

而若有线程想要获取锁,就调用以上方法尝试使用CAS修改state变量,修改成功则表示成功获取锁,如果获取锁失败,线程就会被包装成结点加入先进先出的队列中,在AQS中该队列是通过双向链表实现的,如以下方法:

构造方法
我们已经知道大概知道了AQS的基本实现原理,而sync又继承了AQS。
查看其构造方法:
public ReentrantLock() {
sync = new NonfairSync();
}
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
其包括两个构造方法,第一个构造方法不传入参数值,默认创建非公平锁,而第二个构造方法会根据传入的参数决定创建非公平锁还是公平锁,我们来看看什么是公平锁和非公平锁。


可以很清楚的看到非公平锁和公平锁都继承了Sync,并且它们存在两个相同的方法不同的具体实现。
lock方法
当调用lock方法时,会调用sync变量的lock方法,而Lock只是一个抽象类,调用时会根据不同的子类执行不同的方法

最低0.47元/天 解锁文章
1148

被折叠的 条评论
为什么被折叠?



