安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

同步工具类CountDownLatch详解

9月9日 凉夕夏投稿
  CountDownLatch简介
  CountDownLatch是JDK并发包中提供的一个同步工具类。官方文档对这个同步工具的介绍是:
  Asynchronizationaidthatallowsoneormorethreadstowaituntilasetofoperationsbeingperformedinotherthreadscompletes。
  上面的英文介绍大致意思是:CountDownLatch的主要功能是让一个或者多个线程等待直到一组在其他线程中执行的操作完成。
  使用列子
  观看上面的解释可能并不能直观地说明CountDownLatch的作用,下面我们通过一个简单的列子看下CountDownLatch的使用。
  场景:主人(主线程)请客人(子线程)吃晚饭,需要等待所有客人都到了之后才开饭。我们用CountDownLatch来模拟下这个场景。publicclassCountDownLatchDemo{privatestaticfinalintPERSONCOUNT5;privatestaticfinalCountDownLatchcnewCountDownLatch(PERSONCOUNT);publicstaticvoidmain(String〔〕args)throwsInterruptedException{System。out。println(lammaster,waitingguests。。。);for(inti0;iPERSONCOUNT;i){intfinalIi;newThread(newRunnable(){SneakyThrowsOverridepublicvoidrun(){System。out。println(Thread。currentThread()。getName()lamperson〔finalI〕);TimeUnit。MILLISECONDS。sleep(500);System。out。println(Thread。currentThread()。getName()count:c。getCount());c。countDown();}})。start();}c。await();System。out。println(allguestsget,begindinner。。。);}}
  上面的列子中,主人(master线程)请了5个客人吃饭,每个客人到了之后会将CountDownLatch的值减一,主人(master)会一直等待所有客人到来,最后输出开饭。
  CountDownLatch的使用方式很简单,下面来看下它的实现原理。原理剖析
  首先我们先看下CountDownLatch重要的APIgetCount():获取当前count的值。wait():让当前线程在此CountDownLatch对象上等待,可以中断。与notify()、notifyAll()方法对应。await():让当前线程等待此CountDownLatch对象的count变为0,可以中断。await(timeout,TimeUnit):让当前线程等待此CountDownLatch对象的count变为0,可以超时、可以中断。countDown():使此CountDownLatch对象的count值减1(无论执行多少次,count最小值为0)。
  下面我们看下具体API的源代码构造函数publicCountDownLatch(intcount){if(count0)thrownewIllegalArgumentException(count0);this。syncnewSync(count);}
  在构建CountDownLatch对象时需要传入一个int型的初始值,这个值就是计数器的初始值。从上面的代码中可以看出,创建CountDownLatch是new了一个Sync对象。privatestaticfinalclassSyncextendsAbstractQueuedSynchronizer{privatestaticfinallongserialVersionUID4982264981922014374L;Sync(intcount){setState(count);}intgetCount(){returngetState();}protectedinttryAcquireShared(intacquires){return(getState()0)?1:1;}protectedbooleantryReleaseShared(intreleases){Dsignalwhentransitiontozerofor(;;){intcgetState();if(c0)intnextcc1;if(compareAndSetState(c,nextc))returnnextc0;}}}
  Sync对象是基于AQS机制实现的,自己实现了tryAcquireShared和tryReleaseShared方法。await方法publicvoidawait()throwsInterruptedException{sync。acquireSharedInterruptibly(1);}
  调用await方法其实是调用了AQS的acquireSharedInterruptibly方法。publicfinalvoidacquireSharedInterruptibly(intarg)throwsInterruptedException{if(Thread。interrupted())thrownewInterruptedException();if(tryAcquireShared(arg)0)doAcquireSharedInterruptibly(arg);}
  在acquireSharedInterruptibly中先判断了下当前线程有没有被中断,假如线程已经被中断了,直接抛出中断异常。否则进入doAcquireSharedInterruptibly。privatevoiddoAcquireSharedInterruptibly(intarg)throwsInterruptedException{finalNodenodeaddWaiter(Node。SHARED);try{for(;;){finalNodepnode。predecessor();if(phead){intrtryAcquireShared(arg);if(r0){setHeadAndPropagate(node,r);p。helpGC}}if(shouldParkAfterFailedAcquire(p,node)parkAndCheckInterrupt())thrownewInterruptedException();}}finally{if(failed)cancelAcquire(node);}}
  doAcquireSharedInterruptibly的处理逻辑是先判断队列中是否只有当前线程,如果只有当前线程的先尝试获取下资源,如果获取资源成功就直接返回了。获取资源不成功就判断下是否要park当前线程,如果需要park当前线程,
  那么当前线程就进入waiting状态。否则在for循环中一直执行上面的逻辑。countDown方法publicvoidcountDown(){sync。releaseShared(1);}
  熟悉AQS机制的会知道上面的代码其实也是调的AQS的releaseShared。releaseShared的方法会调到Sync中的tryReleaseShared。protectedbooleantryReleaseShared(intreleases){Dsignalwhentransitiontozerofor(;;){intcgetState();if(c0)intnextcc1;if(compareAndSetState(c,nextc))returnnextc0;}}
  上面的代码逻辑很简单:status的值是0的话就返回true,否则返回false。返回true的话,就会唤醒AQS队列中所有阻塞的线程。使用场景场景一:将任务分割成多个子任务,每个子任务由单个线程去完成,等所有线程完成后再将结果汇总。(MapReduce)这种场景下,CountDoenLatch作为一个完成信号来使用。场景二:多个线程等待,一直等到某个条件发生。比如多个赛跑运动员都做好了准备,就等待裁判手中的发令枪响。这种场景下,就可以将CountdownLatch的初始值设置成1。
  简单总结CountDownLatch的初始值不能重置,只能减少不能增加,最多减少到0;当CountDownLatch计数值没减少到0之前,调用await方法可能会让调用线程进组一个阻塞队列,直到计数值减小到0;调用countDown方法会让计数值每次都减小1,但是最多减少到0。当CountDownLatch的计数值减少到0的时候,会唤醒所有在阻塞队列中的线程。
投诉 评论

5g大众化还有多久?现在买iPhoneXsmax还可以用多久5g大众化还有多久?现在买iPhoneXsmax还可以用多久不被淘汰?5G大众化基本还有3年左右的时间,如果确实对iPhoneXSmax比较中意,那还是可以出手购买。iPhon……快看我国首个互联网货运安全运营标准发布,3月1日起实施记者白帆编辑货拉拉跳车事件的余波仍未了,货运行业正在加速规范化。日前,中国交通运输协会正式发布了《互联网货运平台安全运营规范》团体标准,这是我国首个互联网货运……苹果聘请MetaAR公关负责人,负责其增强现实(AR)产品12月27日,从外媒了解到,据彭博社记者马克古尔曼(MarkGurman)称,苹果已经聘请了Meta(Facebook)的通信和公共关系主管AndreaSchubert,负责其……手机感染病毒如何判定?病毒可造成哪些危害?可别不当回事现在的手机对人们来说至关重要,因为它已经不仅仅只是一个通讯工具了,我们可以利用手机进行娱乐、学习、影视和工作,现在人出门可以忘记带现金,但却忘记不了带手机,因为手机支付已经深入……同步工具类CountDownLatch详解CountDownLatch简介CountDownLatch是JDK并发包中提供的一个同步工具类。官方文档对这个同步工具的介绍是:Asynchronizationa……华为为什么不给一些国内的手机厂商供应5G芯片呢?是因为产能还华为公司的核心定位核心芯片自己使用,按照华为每年的在消费电子领域产品出货量,能够满足自我的供给已经不错了,还有很重要的一个原因华为的5G芯片也是自己核心竞争力的体现,卖给竞争对……6月快到了,余额宝还能放钱吗?6月份与余额宝有关的事情,目前有两件:银行关闭第三方支付直连银行的代扣通道根据之前网联的文件规定,银行将于6月30日前关闭第三方支付直连银行的代扣通道,督促第三方尽快接入……50倍变焦1。08亿新机,8256G卖2999,值吗?凭借着高性价比优势杀回中国市场后,摩托罗拉的新机似乎越来越受欢迎了。一代1999炸响了一颗巨雷,真实的不鸣则已,一鸣惊人。在一个品牌热度逐渐回转的时候,最怕的就是新……iPhoneSE2要来了?亚马逊上架屏幕保护膜最近,苹果在其官网更新了iPhoneSE的AppleCare的服务计划,但是目前显示的是暂未发售,所以我们猜测,新一代的iPhoneSE很快就要到来了。巧的是,在亚马逊的……买手机的朋友不妨再等等,9月即将发布的三款新机很给力本月可谓是妥妥的新机发布大月,各大厂商新机是一款接着一款登场,生怕在激烈的竞争中落了伍,一时间许多小伙伴也是有了购机欲望,不过今天笔者想说的是,最近有购机想法的朋友可以再等等,……特斯拉回应北京机场高速追尾事故车主误踩加速踏板来源:中国新闻网中新财经4月27日电(葛成)针对4月22日发生在北京机场二高速的追尾事故,27日,特斯拉方面向中新财经回应称,数据显示,该事故系车主误操作造成。此前,当事……价格更低?小米12Lite通过EEC认证IT之家1月12日消息,上月,外媒Xiaomiui曝光了大量关于小米海外新机的信息,包括小米12Lite和小米12LiteZoom等。昨日晚间,Xiaomiui爆料称,型……
用户数量超三千万,华为公布下一批鸿蒙系统升级机型宿舍好物分享,平价实用的智能插排还有小屏旗舰吗?翻箱倒柜找出3款,闭着眼买就可以卖车售后一把抓!余承东改任华为智能汽车项目CEO五大天价电子产品!手表2。5亿,电视1500万,网友格局打开公司经销窜货严重,有什么解决办法?程序员求职无果,留言国务院,一不小心上热搜短视频麦克风轻易随行!得胜V1领夹式无线摄像麦克风Rust编程语言里的future陕西综合科技创新水平排名全国第九手机充电先插哪头?学会这4招,让你的手机电池寿命延长10倍DxOMark相机榜单更新,iPhone13Pro未对华为P新鲜的蜂蜜可以放多久?春光流年竞聘所长演讲稿腹泻怎么办对付腹泻拉肚子偏方来帮忙2020最新女生瘦脸刘海自带空气感刘海修颜必备中层领导者应具备的12项技能毛樱桃熟了小学生作文我是大自然中的一员青春的三束阳光中戏校花佟丽娅好美白色礼服穿出贵族风椰奶肌是一绝文德皇后是怎么去世的,文德皇后是怎么死的?假如我是一条鱼

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利