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

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

个人理解AQS:

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

1
2
3
4
 
/**
  
* The synchronization state.
  
*/
 
private 
volatile 
int 
state;

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

1
2
3
4
5
6
7
8
9
10
11
12
 
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常用这么写,

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

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

1
2
3
public 
void 
lock() {
   
sync.lock();
}