CountDownLatch原理简介和使用过程(3)

简介: CountDownLatch原理简介和使用过程(3)

image.png


image.png


image.png


image.png


我们需要一个通知信号,主要是因为当前线程要被挂起了(park)。
而如果waitStatus已经是’SIGNAL’的话就无需修改,直接挂起就好,
而如果waitStatus是’CANCELLED’的话,说明prev已经被取消了,是个无效节点了,那么无需修改这个无效节点的waitStatus,而是需要先找到一个有效的prev。
因此,剩下的情况就只有当waitStatus为’0’和’PROPAGAET’了(注意,waitStatus为’CONDITION’是节点不在等待队列中,所以当下情况waitStatus不可能为’CONDITION’),这时我们需要将prev的waitStatus使用CAS的方式修改为’SIGNAL’,而且只有修改成功的情况下,当前的线程才能安全被挂起。
还值得注意的时,因此该方法的CAS操作都是没有自旋的,所以当它操作完CAS后都会返回false,在外层的方法中会使用自旋,当发现返回的是false时,会再次调用该方法,以检查保证有当前node有一个有效的prev,并且其waitStatus为’SIGNAL’,在此情况下当前的线程才会被挂起(park)。


image.png


image.png



源码分析未完待续 下篇文章继续分析


DEMO代码链接


https://gitee.com/pingfanrenbiji/myconcurrent/tree/master/src/main/java/pers/hanchao/concurrent/eg14


参考文章


https://www.jianshu.com/p/9ee0194d598c
相关文章
|
2月前
|
算法 Java
JAVA并发编程系列(8)CountDownLatch核心原理
面试中的编程题目“模拟拼团”,我们通过使用CountDownLatch来实现多线程条件下的拼团逻辑。此外,深入解析了CountDownLatch的核心原理及其内部实现机制,特别是`await()`方法的具体工作流程。通过详细分析源码与内部结构,帮助读者更好地理解并发编程的关键概念。
|
5月前
|
Java 调度
Java并发基础-线程简介(状态、常用方法)
Java并发基础-线程简介(状态、常用方法)
37 0
|
5月前
|
存储 安全 Java
深入剖析Java并发库:Exchanger的工作原理与应用场景
深入剖析Java并发库:Exchanger的工作原理与应用场景
|
Java
【Java深层系列】「并发编程系列」让我们一起探索一下CountDownLatch的技术原理和源码分析
【Java深层系列】「并发编程系列」让我们一起探索一下CountDownLatch的技术原理和源码分析
97 0
【Java深层系列】「并发编程系列」让我们一起探索一下CountDownLatch的技术原理和源码分析
每日一博 - CountDownLatch使用场景分析以及源码分析
每日一博 - CountDownLatch使用场景分析以及源码分析
102 0
|
存储 Java
【Java技术指南】「原理剖析」synchronized工作原理分析
【Java技术指南】「原理剖析」synchronized工作原理分析
106 0
【Java技术指南】「原理剖析」synchronized工作原理分析
|
Java
【Java技术指南】「原理剖析」Semaphore工作原理分析
【Java技术指南】「原理剖析」Semaphore工作原理分析
104 0
|
Java API Spring
java并发原理实战(4) -- 线程的创建方式
java并发原理实战(4) -- 线程的创建方式
122 0
java并发原理实战(4) -- 线程的创建方式
|
Java 调度
【Java原理探索】深入分析Mutex锁的运行原理
【Java原理探索】深入分析Mutex锁的运行原理
240 0
|
缓存
CountDownLatch原理简介和使用过程(2)
CountDownLatch原理简介和使用过程(2)
110 0
CountDownLatch原理简介和使用过程(2)