ConditionObject的await方法分析

简介: ConditionObject的await方法分析

ConditionObject的await方法分析

  • 判断当前线程是否中断,中断直接抛出非法监视器状态异常
  • 要是没有中断则通过addConditionWaiter()方法将该节点加入到Condition的单向链表中
  • 通过fullyRelease(node)方法一次新释放掉锁资源
  • 初始化一个状态模式为0的标记
  • 执行while判断,要是线程不在AQS队列中就挂起该线程(要是在AQS队列中可能有一种情况那就是该线程刚释放锁资源,立刻就被唤醒,所以他会进入AQS队列自然不用去挂起他)
  • 检查当前线程在获取锁资源的时候有没有被中断过

线程添加到Condition单项链表中的代码分析

  • 获取尾节点
  • 尾节点不为空,并且尾节点的状态值不为-2,那么就取消当前节点,并重新获取尾节点
  • 创建新的节点,并将节点的状态值设置为-2.
  • 如果当前节点是尾节点是null,直接将刚才创建的节点放置为第一个等待节点
  • 否则就排在尾节点的后面
  • 最后返回当前节点

分析后半部分await()代码的含义

  • 判断当前线程的中断模式

  • 解释三目运算符,要是线程没有被中断,返回0
  • THROW_IE:中断唤醒
  • REINTERRUPT:signal唤醒,并且线程在AQS队列中
  • 此处存在一个细节就是Thread.interrupted()能查看当前线程状态并重置当前线程状态

  • 下面这个方法要是返回true,则意味着线程时中断唤醒并且在AQS队列中,只有以上两个条件都满足才会返回true。
  • 下面这个方法在singal也有一个一样的基于CAS的判断,要是能进来那么就说明是中断唤醒的线程
  • 将当前节点添加到AQS队列
  • 往后判断当前线程是否在AQS队列中,因为基于singal唤醒的线程可能不在AQS队列。

isOnSyncQueue(node)分析

  • 判断当前node节点是否在AQS队列上
  • 两个条件当前节点的状态为-2或者当前节点的前一个节点为空都是不在
  • 要是节点的下一个节点不为空就在了,因为在Condition的单向链表中没有next这个指针

findNodeFromTail(node)队列中找到当前节点

目录
相关文章
|
2天前
|
数据采集 前端开发 JavaScript
如何在爬虫过程中正确使用Promise对象和async/await?
如何在爬虫过程中正确使用Promise对象和async/await?
24 2
|
2天前
|
前端开发
Await和Async是什么?跟Promise有什么区别 使用它有什么好处
Await和Async是什么?跟Promise有什么区别 使用它有什么好处
|
2天前
|
前端开发
Promise和async/await之间有什么区别
Promise与async/await是异步编程的两种模式。Promise使用.then()和.catch()处理回调,语法较复杂,易出现回调地狱;而async/await提供更清晰的顺序代码,使用try/catch进行错误处理,使异步操作更易读、易维护。Promise在控制流和错误堆栈方面较为灵活,但定位错误难,而async/await自动等待、线性控制流,错误堆栈清晰。两者各有优势,选择取决于具体需求和偏好。
|
2天前
|
监控 前端开发 JavaScript
async/await:使用同步的方式去写异步代码
async/await:使用同步的方式去写异步代码
58 1
|
9月前
|
前端开发
promise ,async/await的基础用法
promise ,async/await的基础用法
|
9月前
|
前端开发 JavaScript
async、await 实现原理
async、await 实现原理
54 1
|
9月前
|
前端开发 JavaScript
Promise和async/await的使用及其应用场景
Promise和async/await的使用及其应用场景
157 0
|
12月前
|
小程序 安全 数据库
小程序里使用async和await变异步为同步,解决回调地狱问题
小程序里使用async和await变异步为同步,解决回调地狱问题
133 0
|
前端开发
【收藏】五种在循环中使用 async/await 的方法
本篇总结了 5 种在循环中使用 async/await 的方法(代码干货都能在浏览器控制台自测):
|
Web App开发 前端开发 JavaScript
关于 Await、Promise 执行顺序差异问题
关于 Await、Promise 执行顺序差异问题
271 0
关于 Await、Promise 执行顺序差异问题