JUT之CountDownLatch

JUT之CountDownLatchCountDownLat 的简单介绍 CountDownLat 也是基于 AQS 的 因为它是通过了 AQS 的 state 值来进行计数 基本操作就是将当前主线程暂停 等到其它线程执行完成以后 再唤醒主线程执行后续操作 达到其它线程可以在同一时间执行 CountDownLat 首先讲到的是 await 方法

大家好,我是讯享网,很高兴认识大家。

CountDownLatch的简单介绍:CountDownLatch也是基于AQS的,因为它是通过了AQS的state值来进行计数。基本操作就是将当前主线程暂停,等到其它线程执行完成以后,再唤醒主线程执行后续操作,达到其它线程可以在同一时间执行

CountDownLatch首先讲到的是await方法,因为await方法是会执行到,将主线程等待其余线程执行完成并调用CountDown减到state等于0再去执行后续操作
在这里插入图片描述
讯享网
在这里插入图片描述
在这里插入图片描述

await方法实际是调用的AQS的acquireSharedInterruptibly方法,而这个方法中首先会挂起当前主线程,挂起以后调用CountDownLatch内部类Sync的tryAcquireShared去获取当前state的值,如果当前存在还有运行的现场则为-1,会进去到后续的doAcquireSharedInterruptibly方法中
在这里插入图片描述
进入到这个方法就证明当前还有线程正在执行,会首先通过共享模式的node去创建一个节点,这个addWaiter方法其实就是创建节点,然后把它放入同步队列,和ReentrantLock的操作是一样的,创建完节点以后会进入到自旋,自旋会首先回获取当前节点的上一级节点,因为本身就只有一个节点,所以头节点也是它,然后会再去尝试获取一下当前state的状态是否还有线程正在执行,如果没有会进入到shouldParkAfterFailedAcquire,因为当前新创建的节点,waitStatus的状态只会等于0,会尝试将当前节点状态改为-1,然后会再一次去循环,改成-1以后就会返回true,调用parkAndCheckInterrupt方法让当前线程被阻塞。直到被唤醒。下一步是countDown
在这里插入图片描述
CoungDown的第一步其实就是拿到当前的state值,去对这个state值进行-1,如果最后的结果等于0就会返回true
在这里插入图片描述
当这个方法返回true时会调用到doReleaseShared是唤醒主线程
在这里插入图片描述
在这里插入图片描述
当子线程唤醒主线程以后,主线程又会开始一次循环,这次循环以后,主线的state状态就=1,会进入到setHeadAndPropagate方法,这里就是关键在这里插入图片描述
这里首先会将当前节点set到头节点,然后刚刚在countdown中已经将当前节点的状态改成了-3所以会进入到setHeadAndPropagate传播
在这里插入图片描述

小讯
上一篇 2025-02-20 16:24
下一篇 2025-04-04 10:20

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/61781.html