学习AQS需要具备的知识1.AQS是什么?
2.AQS为什么是JUC的基础
同步器
3.AQS设计AQS中有state 等于0代表没有线程占用,大于0小于1代表被占用,大于1代表可重入锁,Node节点是waitstatus****
4.AQS源码
4.1引用关系图
4.2Node属性
4.3 lock 解读aqs源码
4.3.3 tryAcquire方法解读
tryAcquire()获取锁失败,会返回fasle调用addwaiter
4.3.3.1 addwaiter方法解读*
**4.3.3.1 第一次node是null会进入enq方法入队,如果tail是null会创建虚拟节点new nod()空白节点 **
1.第一个节点进入,tail为null的图
2.第二个节点进入compareAndSetTail设置尾指针
4.3.4 acquireQueued() 1代表占用。0代表不占用
predecessor方法获得上一个节点
acquireQueued方法中又有tryAcqueire方法尝试获取锁 入队
shouldParkAfterFailedAcquire方法
如下图 当A线程占用了锁,B节点进入的时候会使前置节点waitStatus也赋值成-1,并调用park阻塞线程B,C也是如此
5.释放锁
1.A线程唤醒队列线程,B线程重新调用Acquire
2.B线程会调用setHead
6.cancelAcquire异常处理锁
node节点是5号节点刚好是尾节点的话,会tail指针指向4号节点,4号节点next指向的5号结点,需要把5号节点置为null
假如是4号节点取消
总结