返回

ReentrantLock - AQS源码分析

后端

说到AQS,就不得不说经典类ReentrantLock,是AQS的最好体现,不过可以先简单说下AQS特性。

什么是AQS?

抽象的队列式同步器(AbstractQueuedSynchronizer,简称AQS),它提供了用来构建锁和其它同步组件的基础框架。AQS既可以使用独占模式,也可以使用共享模式。

在独占模式下,一个资源只能被一个线程同时访问。而在共享模式下,一个资源可以被多个线程同时访问。

ReentrantLock的实现原理

ReentrantLock是AQS的一个实现。它是一个可重入锁,这意味着同一个线程可以多次获取同一个锁。

ReentrantLock的实现原理是使用一个队列来存储等待获取锁的线程。当一个线程获取锁时,它将被放在队列的头部。当另一个线程尝试获取锁时,它将被放在队列的尾部。

当锁被释放时,队列中的第一个线程将被唤醒并获取锁。

ReentrantLock的源码分析

ReentrantLock的源码相对复杂,但我们可以通过分析它的关键方法来理解它的实现原理。

1. 构造方法

ReentrantLock的构造方法如下:

public ReentrantLock() {
    sync = new NonfairSync();
}

其中,sync是ReentrantLock的同步器。NonfairSync是一个不公平锁,这意味着等待获取锁的线程的顺序与它们进入队列的顺序无关。

2. lock方法

ReentrantLock的lock方法如下:

public void lock() {
    sync.acquire(1);
}

lock方法尝试获取锁。如果锁已被其他线程获取,则当前线程将被放在队列的尾部并等待。

3. unlock方法

ReentrantLock的unlock方法如下:

public void unlock() {
    sync.release(1);
}

unlock方法释放锁。如果队列中还有其他线程等待获取锁,则队列中的第一个线程将被唤醒并获取锁。

总结

ReentrantLock是一个经典的锁实现,它使用AQS框架来实现锁的功能。ReentrantLock是一个可重入锁,这意味着同一个线程可以多次获取同一个锁。ReentrantLock的源码相对复杂,但我们可以通过分析它的关键方法来理解它的实现原理。