一、什么是AQS?
AQS也就是AbstractQueuedSynchronizer(抽象队列同步器),放在java.util.concurrent.locks包下。
AQS是一个抽象类,大概定义如下:
public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements Serializable {
}
它是很多同步器的基础框架,比如ReentrantLock、CountDownLoatch、Semaphore等。
二、AQS实现原理
在AQS内部,维护了:
- state变量:用
volatile int修饰,当state大于0的时候说明对象锁已经被占有了,state的修改动作是通过CAS来完成的 - 工作队列:FIFO队列,用来实现线程的排队工作,当线程加锁失败时,该线程会封装成一个Node节点放在队列尾部
- Node节点:存放了
int waitStatus、Node prev、Node next、Thread thread