我们进入ReentrantLock源码中查看其内部类
- Sync 对AQS进行扩展公共方法并定义抽象方法的抽象类
- FaireSync 实现公平锁的AQS的实现类
- UnFairSync 实现非公平锁的ASQ的实现类
我使用例子进行的debug,然后一步一步看源码。例子在文章最后面
以下流程皆以非公平锁为例
线程竞争锁资源
AQS的state解释:
- 0 表示锁没有被占用
- 1 表示锁被占用了
- > 1 表示锁被重入了 PS: ReentrantLock是可重入锁
获得锁执行流程
- 创建ReentrantLock对象
// ReetrantLock 默认创建一个非公平锁的AQS
public ReentrantLock() {
sync = new NonfairSync();
}
- 然后我们调用lock方法请求锁
- 成功,即将锁的owner主人设置为当前线程,接下来就是回到线程中执行线程的任务。
- 失败,即进入acquire的流程。
static final class NonfairSync extends Sync {
final void lock() {
// 请求锁资源,如果将锁的state状态0改成1,即为成功获得锁资源
if (compareAndSetState(0, 1))
// 将锁的拥有者设置为当前线程,里面就一句话没啥好看的
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
}
下面是AQS阻塞链表是由一个双向链表组成的。
阻塞链表的成员对象Node的waitState状态解释:
- CANCELLED = 1 表示线程已经被取消了
- SIGNAL = -1 表示后继线程需要unpark解除阻塞,下图即表示。
锁竞争失败流程
- 进入acquire方法
public final void acquire(int arg) {
// 首先再次请求锁
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
- 首先会执行tryAcquire方法
protected final boolean tryAcquire(int acquires) { // 注意:我们进入的是非公平锁的tryAcquire实现
return nonfairTryAcquire(acquires);
}
再次进入nonfairTryAcquire(acquires)方法
final boolean nonfairTryAcqu