1. AQS介绍
AQS全名是AbstractQueuedSynchronizer,是JUC(java并发包)的一个同步工具类,是很多并发类的基础,比如ReentrantLock,CountDownLatch,ReentrantReadWriteLock等都是继承AQS,然后再自己实现相应的tryAcquire和tryRelease方法的,所以了解AQS的原理以及结构有助于了解其他并发类。
2. AQS和Synchronized
3. 设计AQS的思路
AQS也可以当作是一个同步器,通过同步器来实现锁的功能,控制线程获取资源以及挂起或唤醒线程,从最基础角度来说,AQS定义了如何获取以及释放锁,而获取以及释放锁的操作离不开三个基本点
- 原子操作:CAS
- 等待对列:CLH Lock queue(实现自旋锁,不用挂起到OS,节省资源),通过Node来实现
- 挂起或唤醒:LockSupport.park(),LockSupport.unpark();
4. AQS的类结构
- state:用volatile修饰,保证可见性,表示当前锁的状态
1.1 在ReentrantLock中,state是已经重入(同一线程多次获取锁)的次数
1.2 在CountDownLatch中,state是锁存器的计数,也就是需要都少次countDown- Node:实现等待队列,将未能获取到锁的线程通过队列形式存储起来
- ConditionObject:实现Condition的功能(等待,唤醒)
5. AQS的两种模式:独占和共享
acquire()的实现
|
|
tryAcquire()是由子类实现,当前讨论ReentrantLock中的FairSync.tryAcquire()
可以画图表示逻辑关系
addWaiter()
|
|
enq():初始化等待队列,设置头结点
|
|
acquireQueued()
|
|