当前位置:网站首页>图解基于AQS队列实现的CountDownLatch和CyclicBarrier
图解基于AQS队列实现的CountDownLatch和CyclicBarrier
2022-06-27 19:23:00 【高粱】
CountDownLatch

CountDownLatch 基于 AQS 共享模式实现
简单上手
CountDownLatch 基于 AQS 的共享模式的使用
new CountDownLatch(线程个数);
初始化对应线程
每个子线程run方法里调用 countDownLatch.countDown();
最后主线程调用 countDownLatch.await();
实现效果: 主线程会等待所有子线程执行结束才往下执行
countDownLatch.countDown()
countDownLatch.countDown() 方法会把AQS的status -1
此时子线程把status值改变后就结束了并没有睡眠
会继续执行下面子线程其他的逻辑(countDown方法一般放在子线程执行逻辑最后,
如果放在前面会导致主线程先于子线程执行逻辑,即导致countDownLatch失效)
countDownLatch.await()
countDownLatch.await() 方法先判断status减到 0 没有就一直阻塞睡眠等待
当所有子线程都调用了 countDownLatch.countDown() 后最后一个子线程唤醒主线程
CyclicBarrier


CyclicBarrier 基于 Condition 和 ReenTrantLock实现
情景预热
CountDownLatch有几个问题:首先CountDownLatch在await之后必须依靠别的线程来给它countDown,打开门闩;
其次CountDownLatch在countDown到0之后,该CountDownLatch的生命周期就结束了,它不能重用。
那么有没有既可以自己给自己打开门闩而且还能重用的呢,有的,那就是CyclicBarrier,译作回环栅栏
存在一个计数变量 parties
CyclicBarrier的使用通俗来说就是
有一个栅栏 CyclicBarrier ,它必须由n(parties)个人才能被推到
推到之后这n个人(线程)才能出来
出来之后呢,再把这个栅栏重新立起来又可以用了(重用)
简单上手
new CyclicBarrier (线程个数,所有子线程执行完后主线程执行的任务);
初始化对应线程
每个子线程run方法里调用cyclicBarrier.await();
实现效果: 所有子线程执行到同一个等待点, 并且等待点可以重新利用
CyclicBarrier属性
lock(ReentrantLock)它是用来给CyclicBarrier的操作加锁的
trip(Condition)用来实现CyclicBarrier的wait和notify的
parties(int)计数值,相当于CountDownLatch的count
barrierCommand(Runnable)当CyclicBarrier打开后,要执行的任务
generation(Generation)CyclicBarrier的代,用来实现CyclicBarrier的重用
count(int)值等于parties,每次有线程进入时,count值减一,减到0的时候CyclicBarrier打开,随后count值被reset为parties
重点dowait源码分享

边栏推荐
猜你喜欢
随机推荐
Shell command used in actual work - sed
oss上传调用的是哪个方法
送你12个常用函数公式,用过的都说好
行业案例|从零售之王看银行数字化转型的运营之道
Go从入门到实战——channel的关闭和广播(笔记)
Modify large online games through CE modifier
uniapp拦截请求
Safe and efficient, non-contact "hand brushing" identification helps epidemic prevention and control
今晚战码先锋润和赛道第2期直播丨如何参与OpenHarmony代码贡献
Oracle的CTAS能不能将约束等属性带到新表?
AI painting minimalist tutorial
强制 20 天内开发 APP 后集体被裁,技术负责人怒批:祝“早日倒闭!”
Let Ma Huateng down! Web3.0, hopeless
如何将队列里面的内容没秒钟执行一次优先级
Shell script controls the startup and shutdown of services - with detailed cases
实际工作中用到的shell命令 - sed
SQL必需掌握的100个重要知识点:用通配符进行过滤
集合代码练习
Codeforces Round #722 (Div. 2)
Serveur mandataire SQUID









