AQS原理:
- 当线程请求的共享资源空闲时,将资源设置为锁定状态,同时将当前线程设置为工作线程
- 当其他线程来请求当前被锁定的资源时,将其暂时放到一个队列当中(基于CLH队列实现)
- CLH队列锁帮助实现其他线程的挂起等待以及唤醒、分配锁功能
注:CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系)。AQS是将每条请求共享资源的线程封装成一个CLH锁队列的一个结点(Node)来实现锁的分配。
AQS 对资源的共享方式
- 独占(exclusive):只有一个线程可以执行(如:ReentrantLock)
- 公平锁
- 非公平锁
- 共享(share):多个线程可同时执行(如Semaphore、CountDownLatCh、 CyclicBarrier、ReadWriteLock)
AQS底层设计模式
- 模板方法模式
参考: