什么是AQS
- ReentrantLock的底层实现
- 支持尝试获取锁
- 支持重入
- 支持打断
- 支持多条件
- 支持公平锁和非公平锁
- 支持共享锁和排他锁
怎么做到的
- 使用了模板方法实现tryAcquire
- 子类Sync实现
- 通过CAS操作state的值,state为volatile修饰,线程可见
- state为0表示锁未被占用,为1表示被占用,大于1表示重入的次数
- 内部使用双向链表实现同步等待队列
- 非公平锁会先尝试获取锁,失败则进入等待队列尾部
- 公平锁直接加入队列尾部
- 加入等待队列的节点判断前置节点状态来决定是否尝试获取锁:如果前置节点为head则尝试