AQS的功能可以分为两类独占功能和共享功能,独占锁功能实现AQS的相应的API,共享的实现共享的相应的API,都是分开的。以下理解的时候,也是分开来说,带着AQS的实现类来讲解AQS的过程。


以下注释代码都是基于JDK1.8,供参考。


个人理解AQS:

AQS用一个state的状态和CAS的原子性保证其实现的基本逻辑。

 /**
  * The synchronization state.
  */
 private volatile int state;


AQS内部有四个基本的方法来保证共享锁和独占锁两种模式的基本实现。

 protected boolean tryAcquire(int arg) {
        throw new UnsupportedOperationException();
 }
 protected boolean tryRelease(int arg) {
       throw new UnsupportedOperationException();
 }
 protected int tryAcquireShared(int arg) {
       throw new UnsupportedOperationException();
 }
 protected boolean tryReleaseShared(int arg) {
       throw new UnsupportedOperationException();
 }

从方法的名称上就可以看见,带Shared的是共享模式,不带其就是独占模式。


独占锁

直接分析AQS类不太好理解,就用我们经常用的ReentrantLock来做分析,解释一下AQS。

ReentrantLock常用这么写,

ReentrantLock lock = new ReentrantLock(是否是公平锁和非公平锁);(true是公平锁)
lock.lock();
lock.unlock();

ReentrantLock公平锁和非公平锁只要你调用lock方法,统一入口都是,sync是一个内部的抽象类,集成了AQS,Sync分为NonfairSync和FairSync内部都有一个lock方法来实现公平和非公平的。

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