1 类图结构
ReentrantLock是JUC包下的一个独占锁,类图结构如下:
可以看到,其实现了Lock接口,并且底层是通过AQS抽象同步队列来实现的,我们直到AQS中有一个state状态变量,在ReentrantLock,state = 0时表示该锁还未被任何线程持有,大于1时则表示该锁已经被线程所持有,并且表示了该锁的重入次数。其中Sync是该类的一个内部类,NonfairSync和FaiSync分别对应获取锁的非公平与公平策略。对于这个锁,我们常用的就是lock与unlock方法,再就是Condition的应用,本文主要对这三者进行分析
2 lock()
该方法是获取锁的方法,具体代码如下所示:
public void lock() {
sync.lock();
}
可以看到实质上是调用内部类sync的lock方法,sync的lock()方法又有两种实现,分别是公平策略与非公平策略
2.1 非公平策略
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);