Java中关于ConditionObject的signal()方法的分析

简介: Java中关于ConditionObject的signal()方法的分析

代码块的展示

  • isHeldExclusively()这个仅持有锁资源的方法,在ReentrantLock中重写进行判断,要是没有持有锁资源那么会返回false,就会出现直接抛异常IllegalMonitorStateException(非法监视器状态异常)
  • 获取排在ConditionObject中单向队列首位的节点线程
  • 最后便是执行doSignal(first)这个方法

doSignal(first)方法分析

  • 通过do while循环实现先执行再判断
  • 获取当前第一个节点的下一个节点,并将该节点置为第一个节点。要是该节点为null,尾巴节点也为null,便于脱离Condition队列说明队列中空空了。
  • 执行判断,要是前一个条件为true,则直接退出循环。否则再判断后续是否还有节点,有的话则会继续唤醒

transferForSignal(first)方法的分析

  • 该方法时唤醒再Condition中排队的线程
  • 通过CAS的方式将状态值由原先的-2修改为0,表示线程被唤醒,要是修改失败则返回false,就会回到上面这个图中执行后续的(first = firstWaiter) != null)判断
  • 要是CAS设置成功(改为0),则会将当前节点放到AQS队列并返回上一个节点 Node p = enq(node);
  • 获取上一个节点的状态,要是大于0或者(存在优先级,前面的先)后续CAS设置取消失败就挂起该线程,要是判断中第一个条件命中,说明线程已经被取消,赶紧唤醒当前线程。要是第一个判断条件没有命中,第二个CAS失败了,依然要唤醒当前线程。

ef9589293fb6413bbaea9fe8212b6d86.png

目录
相关文章
|
6天前
|
Java 编译器
【Java开发指南 | 第十九篇】Java方法
【Java开发指南 | 第十九篇】Java方法
9 0
|
1天前
|
安全 Java 编译器
Java一分钟之——泛型方法与泛型接口
【5月更文挑战第20天】Java泛型提供编译时类型安全检查,提升代码重用和灵活性。本文探讨泛型方法和接口的核心概念、常见问题和避免策略。泛型方法允许处理多种数据类型,而泛型接口需在实现时指定具体类型。注意类型擦除、误用原始类型和泛型边界的理解。通过明确指定类型参数、利用通配符和理解类型擦除来避免问题。泛型接口要精确指定类型参数,适度约束,利用默认方法。示例代码展示了泛型方法和接口的使用。
26 1
Java一分钟之——泛型方法与泛型接口
|
1天前
|
Java
滚雪球学Java(35):揭秘Java方法的返回值,从void到诸多数据类型
【5月更文挑战第10天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
10 0
滚雪球学Java(35):揭秘Java方法的返回值,从void到诸多数据类型
|
2天前
|
并行计算 Java API
Java 8中的接口默认方法和静态方法以及并行数组
【5月更文挑战第19天】Java 8引入了许多新特性,其中包括接口的默认方法和静态方法,以及并行数组的能力。这些特性增强了Java的面向对象编程模型和数组处理能力。让我们深入了解它们的概念和实践。
20 2
|
2天前
|
Java 编译器
滚雪球学Java(34):探究Java方法的神奇魔法和参数传递奥秘
【5月更文挑战第9天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
10 1
滚雪球学Java(34):探究Java方法的神奇魔法和参数传递奥秘
|
4天前
|
Java
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结
|
6天前
|
Java
Java String 避免空指针的方法
Java String 避免空指针的方法
5 0
|
6天前
|
Java 关系型数据库 MySQL
【Java Spring开源项目】新蜂(NeeBee)商城项目运行、分析、总结
【Java Spring开源项目】新蜂(NeeBee)商城项目运行、分析、总结
156 4
|
6天前
|
Java 编译器
【Java开发指南 | 第十七篇】Java 方法
【Java开发指南 | 第十七篇】Java 方法
8 1
|
6天前
|
Java
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
15 4