真实生活中的例子对于CountDownLatch和的CyclicBarrier(Real Life

2019-07-29 00:12发布

一个例子是通过我们的培训师,当他被解释CountDownLatch和的CyclicBarrier之间的区别之一给出。

CountDownLatch :假设一块石头可以通过10人被取消,所以你会等待所有10个来。 那么只有你能举起石头。

CyclicBarrier :如果你要野餐,你需要首先从那里你都将开始你的旅程一些共通点见面。

如果有人使用这些意见一致,请给我一些细节。

我已经阅读这两个类太阳API。 但我需要一些更多的解释。

Answer 1:

关键的区别是, CountDownLatch在使用的所有线程的线程分隔成服务员arrivers CyclicBarrier执行两个角色。

  • 用弹簧锁,服务员等待最后到达线程到达,但这些抵达的线程不做任何等待自己。
  • 随着一道屏障,所有线程到达,然后等待最后一个到达。

你的锁例如意味着所有的十人必须等待的石头抬起在一起。 不是这种情况。 一个更好的现实世界的例子是考试促请人谁耐心等待每一个学生在他们试手。 一旦他们完成考试,并可以自由离开学生不要等待。 一旦最后一个学生手中的考试(或期限届满),提示器将停止等待,留下了与测试。



Answer 2:

在一个假设的影院,

它被称为互斥 ,如果只有一个人让观看比赛
它被称为信号量 ,如果人N多让观看play.If任何人玩,然后其他人可以被允许观看比赛过程中离开剧院。
如果没有人允许进入,直到每个人腾出theater.Here每个人都有自由意志离开剧院则称为CountDownLatch。
它被称为的CyclicBarrier如果影院将无法启动,直到每个人都在剧场进入。 这里艺人无法启动秀,直到所有的人进入并抢座位。 一旦发挥完成相同的屏障将适用于下届展会

在这里,人是线程,玩的就是资源。



Answer 3:

现实世界的例子,我可以看到所有的答案实际上是缺少一个真实的例子。 由于在如何将这些类可以在软件领域使用

  1. CountDownLatch一个多线程的下载管理器。 下载管理器将启动多个线程同时下载的文件的各个部分。(提供服务器支持多线程下载)。 这里每个线程都调用实例锁的倒计时方法。 在所有的线程都执行完毕,线程与倒计时锁存器将在不同的作品中各部分结合在一起成一个文件关联

  2. 的CyclicBarrier相同的情况above..But假设文件从P2P下载。 同样多线程下载件。 但在这里,假设你想在特定的时间间隔之后进行的下载件intergity检查。 这里循环障碍起着重要的作用。 每个时间间隔后,每个线程都在等待的屏障,与cyclibarrier相关联的线程可以做的完整性检查。 这完整性检查可以多感谢的CyclicBarrier次完成

如果有什么不正确,请大家指正。



Answer 4:

CyclicBarrier是可重复使用的,所以它更像是赛车之旅,每个人都继续在巡回赛的下一站之前满足于一个航点。



Answer 5:

用例1假设你有一个大的工作分成10个小任务,每一个线程。 你必须等待了10个任务端考虑完成任务之前线程。

因此,主要的工作引发线程初始化的CountDownLatch所使用的线程数,它的任务分配给线程,并等待锁引发为零await方法。 每个执行的线程将调用countDown在其任务结束。 最后,当所有线程已经完成,因此认为所有的工作完成了,主线程将被唤醒。 该方案使用doneSignal在CountDownLatch的javadoc锁介绍。

用例2假设你有一个很大的工作拆分成* m的任务,分布在n个线程。 米对应于矩阵行和你有一个总来计算每一行。 在这种情况下,线程必须结束,使总的行计算每个任务后进行同步。 在这种情况下,一个CyclicBarrier初始化的线程的数目n被用于等待每一行计算结束(事实上m次)。

比较两者的CountDownLatch应该只使用1次和CyclicBarrier作为算法需要为一组螺纹的同步点可被用作许多次。



Answer 6:

理论分野:

在CountDownLatch,主线程等待其他线程完成其执行。 在的CyclicBarrier,工作线程等待对方完成其执行。

一旦计数达到零和锁存器是开放的,而另一方面的CyclicBarrier可以通过重新设置屏障,一旦屏障被打破被重用,你不能重复使用相同的CountDownLatch实例。

现实生活中的例子: -

CountDownLatch:考虑IT世界场景,开发小组(A和B),他希望把它分配给QA团队测试,只有当两个队完成了他们的任务之间划分管理模块。

这里管理线程的工作为主线,并开发团队作品工作者线程。 经理线程等待开发团队线程来完成自己的任务。

的CyclicBarrier:考虑同样的IT世界场景,经理开发团队(A和B)之间划分模块。 他去休假,并要求这两个队等待对方完成各自的任务,一旦双方完成其分配给QA团队进行测试。

这里管理线程的工作为主线,并开发团队作品工作者线程。 开发团队线程等待完成自己的任务后,其他开发团队线程。



Answer 7:

CountDownLatch:如果我们希望我们所有的线程做

东西+倒计时

这样其他候车 (机计数到达零), 线程可以继续,我们可以使用倒计时闩锁。 究竟是谁做的倒数可以继续在这种情况下,但不保证该行latch.countdown(后处理之前,所有线程)将会等待后,其他线程在latch.countdown(REACH),但它有一个保证其他 latch.await()达到零后等待的线程只会进一步启动。

的CyclicBarrier:如果我们希望所有的线程

做点什么+等待在公共点+做点什么

(每个等待通话将减少等待时间线程在进一步落实)

的CyclicBarrier功能可以通过CountDownLatch一次通过调用latch.countdown(),其次是latch.await()的所有线程来实现。

但同样你不能复位/重用countdownlatch。

其中I使用的CyclicBarrier最好的例子是初始化多个高速缓存(由多个线程加温),然后开始进一步处理,我想在同步再次重新初始化其它高速缓存。



Answer 8:

的循环障碍,顾名思义可循环使用。 对于例如:我是一个公司的HR找N多简历来自不同的工作门户网站源。 我有一个包含按优先级排序技能的技能阵列。 对于前JAVA,C#,Python的。 我想求n重新开始匹配的Java技能,但如果我不找到不需要。 简历的,我的下一个技能等重新搜索。

我创建了一个工人每一个扫描过的简历,在指定的作业饲料。 两个工人将开始在他们的工作主要技能搜索饲料。

执行搜索工人将检查中发现的N个恢复后。 如果找到了,工人将重置屏障并返回。 否则,它会等待其他工作人员完成。 如果没有发现静像N份简历,搜索将再次恢复,对技能数组中的下一个技能。 因此,搜索可以递归调用/循环地,而不需要创建一个新的循环障碍。



文章来源: Real Life Examples For CountDownLatch and CyclicBarrier