Please enable JavaScript.
Coggle requires JavaScript to display documents.
AQS - Coggle Diagram
AQS
-
Node
状态取值
- CANCELLED 1 对应节点线程被取消
- SIGNAL -1 表示后继节点需要被唤醒
- CONDITION -2 表示改节点在等待条件
- PROPAGATE -3 唤醒后继节点
-
- 注意:通过Node我们可以实现两个队列,
- 一是通过prev和next实现CLH队列(线程同步队列,双向队列),
- 二是nextWaiter实现Condition条件上的等待线程队列(单向队列),这个 Condition主要用在ReentrantLock类中。
需要子类实现的模板方法
独占锁
- tryAcquired(int)
- tryRealeased(int)
获取资源的过程
- 首先调用tryAcquire(arg)尝试去获取资源。前面提到了这个方法是在子类具体实现的。
- 如果获取不到则将线程插入队列尾,先CAS插入如果没插进去,再自旋插入
- 判断当前节点的前继是否是Head如果是则尝试获取资源,获取到则把当前节点设为Head ,如果没获取到则把前继节点状态设置位SIGNAL 以便可以安全阻塞,然后调用LockSupport.park() 阻塞线程,等待Signal
- 如果线程在等待过程中被中断过,它是不响应的。只是获取资源后才再进行自我中断selfInterrupt(),将中断补上。
释放资源
release(int)方法是独占模式下线程释放共享资源的顶层入口
如果彻底释放了(即state=0),它会唤醒等待队列里的其他线程来获取资源
- 调用tryRealease释放资源,该方法由子类实现,正常直接状态减一,如果状态=0 要返回true代表,否则返回false
- unparkSuccessor(Node)方法用于唤醒等待队列中下一个线程.下一个线程不一定是下一个节点而是下一个可用的线程
共享锁
- tryAcquireShare(int)
- tryAcquireShared(int):
-
-
-