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