几个月之前分别对这两个知识点源码做过一些总结,请参照如下地址
- java多线程知识点 - AQS - CountDownLatch: https://blog.youkuaiyun.com/qq_31615049/article/details/80427184
- java多线程知识点 - AQS - CyclicBarrier: https://blog.youkuaiyun.com/qq_31615049/article/details/80428185
虽说之前有一笔带过两个的区别但是这次随着对技术的理解,再做一次二者的总结
相同点
他们都用作计数器的功能。 |
都是应用于多线程中组团执行任务的模式,以屏障作为线程集结点 |
不同点
计数方式 | CountDownLatch | 使用.countDown()方法,计数器依次递减 |
CyclicBarrier | 使用.await()方法,count数依次递减,count初始值等于构造器的parties值 |
计数值重置 | CountDownLatch | 不重置:意味着屏障只能使用一次 |
CyclicBarrier | 重置:可以拥有多次到达屏障的机会,调用reset()方法即可重置 |
线程阻塞 | CountDownLatch | 阻塞调用await()的线程,也就是所谓的主线程等待另一个或多个线程完成某事 |
CyclicBarrier | 阻塞调用await()的线程,也就是多个子线程互相等待,当所有子线程都完成时一起继续下一个事情 |
查看计数 | CountDownLatch | getCount()方法:获取当前计数值,也就是还剩多少个线程名额未执行 |
CyclicBarrier | gerParties()方法:屏障对象数,初始化屏障对象数 getNumberWaiting()方法:在屏障处等待的线程个数 |