在 Java 中 CycliBarriar 和 CountdownLatch 有什么区别?

CyclicBarrier 可以重复使用 CountdownLatch 不能重复使用

Java  concurrent 包里面的 CountDownLatch 其实可以把它看作一个计数器

只不过这个计数器的操作是原子操作同时只能有一个线程去操作这个计数器

也就是同时只能有一个线程去减这个计数器里面的值

你可以向 CountDownLatch 对象设置一个初始的数字作为计数值任何调用这个 

对象上的 await()方法都会阻塞直到这个计数器的计数值被其他的线程减为 0  

所以在当前计数到达零之前,await 方法会一直受阻塞之后会释放所有等待 

的线程,await 的所有后续调用都将立即返回这种现象只出现一次——计数无法 

被重置如果需要重置计数请考虑使用 CyclicBarrier。

CountDownLatch 的一个非常典型的应用场景是有一个任务想要往下执行 

必须要等到其他的任务执行完毕后才可以继续往下执行假如我们这个想要继续 

往下执行的任务调用一个 CountDownLatch 对象的 await()方法其他的任务执 

行完自己的任务后调用同一个 CountDownLatch 对象上的 countDown()方法

这个调用 await()方法的任务将一直阻塞等待直到这个 CountDownLatch 对象 

的计数值减到 0 为止

CyclicBarrier 一个同步辅助类它允许一组线程互相等待直到到达某个公共屏 

障点 (common barrier point)。在涉及一组固定大小的线程的程序中这些线程 

必须不时地互相等待此时 CyclicBarrier 很有用因为该 barrier 在释放等待 

线程后可以重用所以称它为循环  barrier。

猜你喜欢

转载自www.cnblogs.com/programb/p/12771076.html