CountDownLatch

1、CountDownLatch 是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

2、CountDownLatch 的构造函数接收一个 int 类型的参数作为计数器,如果你想等待 N 个点完成,那么就传入 N。当我们调用 CountDownLatch 的 countDown() 方法时,N 就会减 1,CountDownLatch 的 await() 方法会阻塞当前线程,直到 N 变成零。

3、CountDownLatch 可以用来控制一个线程等待多个线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。

CyclicBarrier

1、CyclicBarrier 是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点(common barrier point)。

2、CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。

3、CyclicBarrier 可以用来实现一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动完所有的框架服务之后再执行。

Semaphore

1、Semaphore 是一个计数信号量,它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。

2、Semaphore 维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。

3、Semaphore 可以用来控制对某组资源的访问权限。例如,对某个服务器的最大访问限制,可以用 Semaphore 来实现,它的计数器可以维护当前访问的个数,如果访问个数超过了限制,则后续线程被阻塞。