城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

同步工具类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爆料称,型……
华为的售后,你给打几分?骁龙865870和骁龙888有什么区别都各好在哪里?苹果公司向荷兰妥协将开放交友软件的第三方支付系统界读丨好难啊!小米11ultra和小米12到底怎么选?数据中心液冷技术助力双碳目标实现她曾是流水线工人,31岁创业,55岁身家700亿,公司市值2内蒙古比特币矿工们每天创造近七百万美元的价值,工作环境如何?OPPO最注重性能的手机,外观轻薄时尚,送家长首选小米12劲敌iQOO9将至,相同芯片更低价格?女人和男人点外卖有什么不同,为什么外卖员都不愿意送?1999元起售!OPPOK9Pro发布,绿厂也玩性价比?2022年真1080p投影仪推荐目前最好用的家用投影仪推荐
连理木为何坰赋2021年上半年吉林黑龙江发展对比毛主席在重大历史关头愈挫愈勇的毛泽东精神建筑工程施工技术管理现状与创新《细节决定成败》读书笔记郑州打了第一枪,哈尔滨福州兰州跟进,急着松绑房地产为了啥遇见唐诗美丽的秋天观察日记作文允许当事人断绝父子关系吗女人应该正确认识胶原蛋白好听的小提琴曲(十首让人美到窒息的小提琴曲)颠覆你认知的下一代手机是什么样子

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁