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();
}



















