CDL 本质上是类似于信号量,而Semaphore 是每次发射一个信号 变回执行一个线程(取决于公平非公平)
创新互联公司提供成都网站建设、网站建设、网页设计,成都品牌网站建设,广告投放平台等致力于企业网站建设与公司网站制作,10余年的网站开发和建站经验,助力企业信息化建设,成功案例突破上千家,是您实现网站建设的好选择.而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元起,快前往官网查看详情吧