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