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)队列中找到当前节点

目录
相关文章
|
Java 数据库连接
后端校验(hibernate-validator)
后端校验(hibernate-validator)
416 0
|
Java Linux Windows
windows实现自动部署jar包运行程序
windows实现自动部署jar包运行程序
431 0
|
SpringCloudAlibaba 监控 Dubbo
SpringCloudAlibaba篇(三)整合Sentinel(限流、流量整形、熔断降级、系统负载保护、热点防护,分布式服务架构的高可用流量防护组件)
SpringCloudAlibaba篇(三)整合Sentinel(限流、流量整形、熔断降级、系统负载保护、热点防护,分布式服务架构的高可用流量防护组件)
SpringCloudAlibaba篇(三)整合Sentinel(限流、流量整形、熔断降级、系统负载保护、热点防护,分布式服务架构的高可用流量防护组件)
|
运维 监控 关系型数据库
运维实战:Windows服务挂掉了怎么办,通过Bat脚本实现自动重启
本文介绍了如何使用Bat脚本自动监控并重启Windows服务器上的挂掉服务,例如MySQL,以避免在假期等情况下需要紧急处理问题。首先,创建一个Bat脚本,设定每小时检查一次服务状态,如果服务停止则自动重启。脚本内容包括检查服务是否运行并根据状态执行相应操作。同时,脚本中包含了确保以管理员权限运行的代码。 脚本需设置为ANSI编码以防止乱码。推荐将Bat脚本封装为Windows服务以保证稳定运行,提供了使用NSSM工具、Windows服务程序和开源的Java工具winsw将批处理脚本转化为服务的方法。这些方法可以确保服务在后台可靠运行,即使在服务意外停止时也能自动恢复。
|
Windows
Windows的mklink使用方法
【5月更文挑战第20天】Windows的mklink使用方法
967 0
|
12月前
|
安全 Java 数据安全/隐私保护
如何配置 Java 安全管理器来避免访问控制异常
配置Java安全管理器以防止访问控制异常,需在启动JVM时通过 `-Djava.security.manager` 参数启用,并设置安全策略文件,定义权限规则,限制代码执行操作,确保应用安全。
788 1
|
缓存 Java 索引
查看并解析当前jdk的垃圾收集器
本文介绍了如何查看和解析当前JDK使用的垃圾收集器,通过在IDEA中配置JVM选项并运行示例代码来展示G1垃圾回收器的详细信息和命令行标志。
150 0
查看并解析当前jdk的垃圾收集器
|
Java Spring 容器
@Resource 和 @Autowired 介绍 为什么使用 @Autowired 会报错,改成@Resource 就对了
本文介绍了`@Autowired`和`@Resource`两种依赖注入注解的区别及使用场景,并解释了为什么在某些情况下使用`@Autowired`会导致错误,而改成`@Resource`则可以解决问题。
905 0
|
Java 测试技术 C#
几个好用的自动化测试工具总结
【6月更文挑战第4天】几个好用的自动化测试工具总结
904 0
|
存储 JSON 数据可视化
Seata Saga 模式快速入门和最佳实践
本文主要介绍 Seata Saga 模式的使用以及最佳实践,围绕三个部分展开,第一部分是 Seata Saga 的简介、第二部分是带大家快速入门,学习怎么使用 Seata Saga 模式,最后一部分将会给大家分享一些 Seata Saga 实践中的经验,帮助用户更快、更好得使用 Seata Saga 模式。
Seata Saga 模式快速入门和最佳实践