请比较 CountDownLatch 类与 CyclicBarrier 类的区别和联系。
CountDownLatch 和 CyclicBarrier 都是用于管理并发线程之间的协调,但它们有一些关键的区别:
- 用途不同:
- CountDownLatch 主要用于一个或多个线程等待其他线程完成某项操作后才能继续执行。它的计数器只能使用一次,即到达零之后不能再次重置。
- CyclicBarrier 主要用于一组线程互相等待,直到所有线程都到达某个公共屏障点。当所有线程到达屏障点后,屏障将被重置,线程们可以继续执行后续操作。CyclicBarrier 可以重复使用。
- 递减方式不同:
- CountDownLatch 的计数器在每个线程完成操作后进行递减,当计数器到达零时,等待的线程可以继续执行。
- CyclicBarrier 的计数器在每个线程到达屏障点时进行递减,当计数器到达零时,所有线程可以继续执行。
- 功能不同:
- CountDownLatch 不能重新设置计数器,只能等待计数器递减到零。
- CyclicBarrier 可以重新设置计数器,意味着它可以处理更复杂的并发场景,例如循环依赖。
- 触发动作不同:
- CountDownLatch 在计数器到达零时没有触发动作,线程只是继续执行。
- CyclicBarrier 可以在所有线程到达屏障点时触发一个预定义的动作(通过 Runnable 参数传递)。
总结:
CountDownLatch 更适合等待其他线程完成某项操作的场景,而 CyclicBarrier 更适合一组线程互相等待,直到所有线程都完成某项操作的场景。此外,CyclicBarrier 可以重复使用,而 CountDownLatch 只能使用一次。