当我们在进行开发工作的过程中,线程上的问题存在疑问去看网上找答案时,文章中都会出现AQS这个关键词,那么AQS是什么?
1.什么是AQS
AQS全称是AbstractQueuedSynchronizer,是阻塞式锁和相关同步器工具的框架
- 存在的的特点有
- 使用state属性来表示资源的状态(独享,还是共享模式),子类需要定义如何维护这个状态,控制如果获取锁和释放锁
getState - 获取state状态
setState - 设置state状态
compareAndSetState - cas 机制设置state状态
- 使用state属性来表示资源的状态(独享,还是共享模式),子类需要定义如何维护这个状态,控制如果获取锁和释放锁
独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源
例如:独占ReenTrantLock 共享Semaphore、CountdownLatch、CycliBarrier等
2.AQS使用
AQS经常用来实现各种同步器,而各种同步器的核心就是对state的操作
实现不可重入锁
- 自定义一个同步器
3.AQS基本思想
AQS的基本思想其实就是对state进行操作
获取锁的逻辑
while(state状态是不能被获取的){
if(阻塞队列中还没有此线程){
入队阻塞
}
}
当前线程出队
释放锁的逻辑
if(state 状态允许了){
if(得到 state){
线程启动
}else{
回到阻塞队列
}
}
要点
- 原子维护state状态
- 阻塞及恢复线程
- 维护队列
4.state设计
- state使用volatile配合cas保证其修改时的原子性
- state使用了32位的int来维护同步的状态
5.阻塞恢复设计
- 早期的控制县城暂停和恢复的api有suspend和resume,但是他们是不可用的,因为他两个有先后顺序,先使用resume的话suspend是不能感知到的
- 现在我们一般采用的是park和unpark来实现线程的暂停和恢复,对于park和unpark来说没有先后顺序,先unpark对park没有影响
- park和unpark是针对线程的,不是针对监视器mointor的,对线程更为友好
- park住的线程可以被interrupt打断就像打断正在run的线程一样
6.队列设计
以上就是本文的全部内容
对于其具体的实现有很多,例如常用的ReentrantLock,可以通过作者的另一篇文章来进行了解
ReentrantLock原理