CDL 本质上是类似于信号量,而Semaphore 是每次发射一个信号 变回执行一个线程(取决于公平非公平)
而CDL 是将所有的信号消耗完成 才开始;
官方案例Driver实现了多线程的同步 执行 以及对主线程的通知!
Cdl 内部Sync 依然继承制AQS,但是他没有公平和非公平而言 因为他的目的是一起执行完成!
await
实际调用的是Sync中
protected int tryAcquireShared(int acquires) {return (getState() == 0) ? 1 : -1;
}
当state==0时 那么和正常线程没有任何区别 也不会加入到队列 -1 会加入到队列
而Sync 初始化时就会给state设置状态量 那么 所以开始调用await 会将线程加入到队列并且park
在SYnc中有释放方法:
protected boolean tryReleaseShared(int releases) {// Decrement count; signal when transition to zero
for (;;) {int c = getState();
if (c == 0)
return false;
int nextc = c-1;
if (compareAndSetState(c, nextc))
return nextc == 0;
}
}
每次释放量为1 并且知道释放0时表示成功
countDown
每次释放数量为1 ,释放一次 并不会让队列中的线程unpark 因为必须等待所有的都释放 也就是state=0时 才会开始执行
总结CDL 的作用是是控制一组线程的并发 以及对多线程完成对主线程的通知
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
本文标题:java并发之CountDownLatch-创新互联
文章路径:https://www.cdcxhl.com/article46/djdohg.html
成都网站建设公司_创新互联,为您提供手机网站建设、移动网站建设、动态网站、网站排名、网站维护、做网站
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联