多线程之AQS学习

学习AQS需要具备的知识在这里插入图片描述1.AQS是什么?
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
2.AQS为什么是JUC的基础

在这里插入图片描述
在这里插入图片描述
同步器在这里插入图片描述

3.AQS设计AQS中有state 等于0代表没有线程占用,大于0小于1代表被占用,大于1代表可重入锁,Node节点是waitstatus****
在这里插入图片描述
在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f3d7831478ce42caa12e3f8925cf27d5.png
在这里插入图片描述
4.AQS源码
4.1引用关系图在这里插入图片描述
在这里插入图片描述
4.2Node属性
在这里插入图片描述

在这里插入图片描述
4.3 lock 解读aqs源码
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述4.3.3 tryAcquire方法解读

在这里插入图片描述

tryAcquire()获取锁失败,会返回fasle调用addwaitera

4.3.3.1 addwaiter方法解读*
Node
在这里插入图片描述
**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号节点取消
在这里插入图片描述

总结

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值