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();
} |
本文转自 豆芽菜橙 51CTO博客,原文链接:http://blog.51cto.com/shangdc/1930701