CountDownLatch 是能使一组线程等另一组线程都跑完了再继续跑;CyclicBarrier 能够使一组线程在一个时间点上达到同步,可以是一起开始执行全部任务或者一部分任务。
一、CountDownLacth
作用:允许一个或多个线程等待其他线程操作
常用方法:await(),await(TimeUnit unit),countDown()
原理:基于共享锁实现
应用场景:
①实现最大的并行性:有时我们想同时启动多个线程,实现最大程度的并行性。例如,我们想测试一个单例类。如果我们创建一个初始计数为1的CountDownLatch,并让所有线程都在这个锁上等待,那么我们可以很轻松地完成测试。我们只需调用 一次countDown()方法就可以让所有的等待线程同时恢复执行。
②开始执行前等待n个线程完成各自任务:例如应用程序启动类要确保在处理用户请求前,所有N个外部系统已经启动和运行了。
死锁检测:一个非常方便的使用场景是你可以使用n个线程访问共享资源,在每次测试阶段的线程数目是不同的,并尝试产生死锁。
使用例子:http://www.importnew.com/15731.html【转载】
二、同步屏障CyclicBarrier
作用:一组线程等待至某个状态之后再全部同时执行
常用方法:构造函数CyclicBarrier(int parties),CyclicBarrier(int parties,Runnable barrierAction)[所有线程到达屏障后优先执行barrierAction],await()
和countDowncatch比:
原理:
三、控制并发数的Semaphore信号量
常用方法:acquire()
原理:基于AQS实现;
应用场景:流量控制
四、线程交换数据Exchanger
常用方法:exchange()