ReentrantLock - AQS源码分析
2024-01-09 02:34:53
说到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的源码相对复杂,但我们可以通过分析它的关键方法来理解它的实现原理。