Java同步器AQS
一、概念
1. AQS(AbstractQueuedSynchronizer),抽象队列式同步器,在java.util.concurrent.locks(JUC)包下,是除了Java自带的synchronized关键字之外的锁机制
2. AQS机制:如果请求的资源被其他线程锁定,将当前线程加入等待队列中
3. 在java.util.concurrent(JUC)包下,多种同步和并发类的实现基于AQS
二、原理
1. CLH队列:一个虚拟的双向队列,不存在队列实例,仅存在节点之间的关联关系,用双向链表实现
2. AQS将每一个线程封装成节点,加入CLH队列中等待获取锁
3. 每个线程使用CAS去修改volatile修饰的共享变量state,修改成功则获取锁成功,否则进入等待队列,然后FIFO先进先出
private volatile int state; //0表示lock,1表示unlock
4. AQS是自旋锁,即当锁被别的线程获取的时候,当前线程循环等待
三、AQS功能
1. 实现独占锁:只有一个线程能访问,例如ReentrantLock
2. 实现共享锁:多个线程可以同时访问,例如Semaphore
3. 实现Condition模型
参考:
https://blog.csdn.net/mulinsen77/article/details/84583716
https://cloud.tencent.com/developer/article/1449175