AQS
概念
AQS 的全称是 AbstractQueuedSynchronized (抽象队列同步器),在java.util.concurrent.locks包下面。
AQS是一个抽象类,主要用来构建锁和同步器,比如ReentrantLock
, Semaphore
, CountDownLatch
,里面都用到了Sync类, Sync类是AQS的子类。
public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable {
}
AQS原理
有一个int类型的成员变量 state 表示同步状态,还有一个内置的FIFO等待队列来完成资源线程的排队工作。
/**
* The synchronization state.
*/
private volatile int state;
ReentrantLock
什么是ReentrantLock
ReentrantLock是一个支持可重入的锁,调用lock方法获取锁之后,再次调用lock,不会阻塞。
支持公平锁和非公平锁,默认是非公平锁。
实现原理
利用 CAS + AQS队列 来实现
ReentrantLock 里面有一个内部类 Sync,Sync 继承 AQS,加锁和解锁的大部分操作都是在 Sync 类中实现的。Sync 有公平锁 FairSync 和非公平锁 NonfairSync两个子类。
/**
* Creates an instance of {@code ReentrantLock}.
* This is equivalent to using {@code ReentrantLock(false)}.
*/
public ReentrantLock() {
sync = new NonfairSync();
}
/**
* Creates an instance of {@code ReentrantLock} with the
* given fairness policy.
*
* @param fair {@code true} if this lock should use a fair ordering policy
*/
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}