JUC之CountDownlatch原理

本文详细介绍了CountDownLatch如何通过继承AbstractQueuedSynchronizer (AQS) 实现线程间的同步控制。CountDownLatch在构造时设定计数器值,调用await方法的线程会在计数器归零前被阻塞;countDown方法则用于递减计数器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

countdownlatch实现了aqs,由此可以知道,同步器锁是由aqs来具体实现的,附出源码

 接下来我们从构造方法开始,同步器锁可以在创建时传入参数,这个参数为count数量,具体的含义上篇文章已经讲解,可以查看本人上篇文章,而在构造器内,它把这个参数又传给了Sync

跟进Sync,它是同步器锁的内部类,是他具体实现了AQS ,然后它又把传过来的count传给了AQS中的state,而AQS中的setState方法是设置变量的重入值,意思就是当一个线程占有这把锁时,state就会+1,当再次重入state++,而其他线程想要获取到锁,就要判断state是否为0

 ,由此可以看出,同步器锁就是把传过来的值传给了AQS当调用同步器锁的countdown方法时,会使得state--,直到为0.

下面查看await方法

在源码中看到,它调用了sync中的 acquireSharedInterruptibly方法,而sync是上面提到的Sync的类型

 而AQS中acquireSharedInterruptibly是可以被打断的,当判断当前线程的打断的是否处于sleep或者wait状态,如果是那么就立即抛出异常,然后获取state的值

 继续跟进,可以看到如果state的值==0那么就返回1否则就返回-1,回到刚才的判断条件如果返回的<0那么就会进入到doAcquireSharedInterruptibly(arg)

 跟进,此方法为AQS中的方法,其实就是死循环,然后获取再次尝试获取state状态,如果还是<=0那么就把它加入到双向链表当中,等待其他线程唤醒,由此countdownlantch原理基本完毕

 总结,其实同步器锁就是调用了AQS中的方法,当await条件不满足时就会把当前线程加入到双向链表当中park住,而唤醒的方法就是调用countdown方法,但是第一个调用countdown后唤醒了await线程,然后获取state发现还是>0,那么就继续加入链表然后park,知道state<=0时才会return出去;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TheJing腥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值