CountDownLatch和CyclicBarrier

CyclicBarrier的官方解释:

A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.

CyclicBarrier是一个同步的辅助类,允许一组线程相互之间等待,达到一个共同点,再继续执行。

CountDownLatch的官方解释:

A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

CountDownLatch是一个同步的辅助类,允许一个或多个线程,等待其他一组线程完成操作,再继续执行。

CountDownLatch场景神还原:

一年级期末考试要开始了,监考老师发下去试卷,然后坐在讲台旁边玩着手机等待着学生答题,有的学生提前交了试卷,并约起打球了,等到最后一个学生交卷了,老师开始整理试卷,贴封条,下班,陪老婆孩子去了。这里提前交卷的学生(可以理解为线程),做完自己的试卷是可以去干自己的事的。而老师只能等待所有的学生全部答完试卷以后才可以干自己的事情。

CountDownLatch场景补充:

玩LOL英雄联盟时会出现十个人不同加载状态,但是最后一个人由于各种原因始终加载不了100%,于是游戏系统自动等待所有玩家的状态都准备好,才展现游戏画面。

抽象图:(感觉很形象)

请输入图片描述

每位乘客(线程)上车后,可用座位减1,直到为0,老司机就开始发车了。

CyclicBarrier:可看成是个障碍,所有的线程必须到齐后才能一起通过这个障碍。

CyclicBarrier场景:公司组织户外拓展活动,帮助团队建设,其中最重要一个项目就是全体员工(包括女同事,BOSS)在完成其他项目时,到达一个高达四米的高墙没有任何抓点,要求所有人,一个不能少的越过高墙,才能继续进行其他项目。其中越过高墙的人,并不能干自己的事,或者去进行下一个项目,必须全部人员都翻过高墙后才可以进行下一个项目。

总结:

  1. CountDownLatch可以让线程分段执行,比如说所有线程做完自己负责的第一阶段的任务后再共同干一件事
  2. CyclicBarrier需要等到每个线程都到达某个点的时候,再一起做一件事或者各自做事,还可以等到某个点后,先汇总结果,然后再各自做事,比如barrierAction线程。
  3. CyclicBarrier可以不停的循环做同样的事,构造函数中线程数量必须跟实际的子线程数量相等。

以上内容大部分来自:https://blog.csdn.net/zzg1229059735/article/details/61191679

原文地址:https://www.cnblogs.com/zhangjianbing/p/13575191.html