AQS:AbstractQueuedSynchronizer 抽象队列同步器
抽象:抽象类,只实现⼀些主要逻辑 定义一些默认的模板方法,有些⽅法由⼦类实现;
队列:使⽤先进先出(FIFO)队列存储数据;
同步:实现了同步的功能。
核心思想:被请求的共享资源空闲时,首先获得共享资源锁的线程被设置为工作线程,共享资源设置为锁定状态(AQS内部使⽤了⼀个volatile的变量state来作为资源的标识)。共享资源被锁定,那么对于其他未获得锁的线程来说,则需要一套线程排队阻塞以及等待唤醒的锁分配机制,这个机制主要是通过AQS内部维护了一个FIFO的CLH队列(虚拟双向循环队列),该队列是一个虚拟的队列,即不存在队列实例,仅存在节点间的关联关系。访问共享资源的线程被封装为Node节点,维护在这个CLH队列中。
资源共享方式:独占式(排他锁)、共享式
独占模式(Exclusive):资源是独占的,⼀次只能⼀个线程获取。如ReentrantLock。
共享模式(Share):同时可以被多个线程获取,具体的资源个数可以通过参数指定。如Semaphore/CountDownLatch。
常见基于AQS的同步器:AQS是⼀个⽤来构建锁和同步器的框架,使⽤AQS能简单且⾼效地构造出应⽤⼴泛的同步器,⽐如我们提到的ReentrantLock,Semaphore,ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。