从网上搜到的文章,在讲到这两者的区别时,大多都引用了以下两句话:
(01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。
(02) CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。
但看完这两句话,从代码角度出发,这两者的区别我一直没有理解。1个线程等待其他线程,和N个线程相互等待,其实从某种角度来讲,意义是差不多的,总归都是到达某个触发点之后,执行所有线程。所以从我个人的角度出发,我觉得第一点更多时候只是意义上的差别,在功能上似乎没有什么区别。(如果各位有什么看法,请指正。)
然后我试下来,我认为两者的关键区别在于第二点,CountDownLatch一旦计数器到0,后面的线程不会再等待,无条件执行,而对于CyclicBarrier,第一轮的数量满足后,第二轮也必须达到指定的数量,才会再次执行。换成代码如下所示:
<<CountDownLatch>>
final int threadCount = 3; ExecutorService service = Executors.newFixedThreadPool(threadCount); CompletionService<Patient> completionService = new ExecutorCompletionService<Patient>(service); final CountDownLatch latch = new CountDownLatch(threadCount); //以下遍历过过程故意将threadCount+2,会发现当 i = threadCount - 1时, //就会触发latch的执行,for循环后续的几个线程(threadCount, threacCount + 1)会直接执行, //没有任何等待,因为latch已经到达0了,不再有任何作用了。 for (int i = 0; i < threadCount + 2; i++) { completionService.submit(new Callable<String>() { public String call() throws Exception { latch.countDown(); latch.await(); return "test message"; } } }
那么对于CyclicBarrier而言,执行过程有所不同
final int threadCount = 3; ExecutorService service = Executors.newFixedThreadPool(threadCount); CompletionService<Patient> completionService = new ExecutorCompletionService<Patient>(service); final CyclicBarrier barrier = new CyclicBarrier(threadCount); //以下遍历过过程故意将threadCount+2,会发现当 i = threadCount - 1时, //就会触发barrier的执行,但是for循环后续的几个线程(threadCount, threacCount + 1)会一直等待, //因为数量是2,没有达到执行点。也就是说CyclicBarrier是循环起作用的,这个是与CountDownLatch的重要区别 for (int i = 0; i < threadCount + 2; i++) { completionService.submit(new Callable<String>() { public String call() throws Exception { barrier.await(); return "test message"; } } }
所以我觉得之前说的第2点,用我的理解来描述的话,应该是这样:
(02) CountDownLatch的计数器一旦为0,无法被重置,失去原有的作用;CyclicBarrier的计数器可以被循环使用,一次循环结束后,可以继续给下一次的循环使用。
以上是根据之前试验得出来的两者之间在使用上的差别,至于其他方面还有什么差别,暂时没有深入研究,后面有时间再继续吧。
相关推荐
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf
1. 什么是线程? 2. 线程和进程有什么区别? 3. 如何在 Java 中实现...7. Java 中 CyclicBarrier 和 CountDownLatch 有什么不同? 8. Java 内存模型是什么? 9. Java 中的 volatile 变量是什么? ......... ........
目录: 简介 1.1 并发编程与线程协作 1.2 CyclicBarrier概述 CyclicBarrier的基本用法 2.1 创建CyclicBarrier对象 2.2 await()方法 控制线程协作数量 ...CyclicBarrier与CountDownLatch的对比 最佳实践与注意事项
java并发编程中CountDownLatch和CyclicBarrier的使用.pdf
CountDownLatch 和 CyclicBarrier 为线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所处理的任务。
有以下类的实例: ThreadPool ScheduledThread CyclicBarrier BlockingQueue CountDownLatch FutureTask CompletionService Semaphore
CyclicBarrier和CountDownLatch一样,都是关于线程的计数器。用法略有不同,测试代码如下:
主要介绍了详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java并发之并发工具类,并发工具类有很多,这里主要介绍了CyclicBarrier、CountDownLatch、Semaphore、Exchanger
Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用 CountDownLatch、CyclicBarrier、Semaphore这些线程协作工具类是基于AQS的,看完这篇博客后可以去看下面这篇博客,了解它们是如何实现的。 Java并发...
5、"利用CyclicBarrier和CountDownLatch解决并发协调难题,提升多线程程序的执行效率和可控性。#并发工具类 #Java并发编程" 6、"volatile与synchronized的巧妙运用,确保数据可见性,解决并发编程中的常见痛点。#...
主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下
java 高并发应用场景
与CountDownLatch不同的是,CyclicBarrier可以重复使用,即当所有线程都到达屏障后,屏障会自动重置,可以继续使用。 CyclicBarrier的构造方法如下: java public CyclicBarrier(int parties, Runnable ...
目录: 简介 1.1 并发编程与线程同步 1.2 CountDownLatch概述 CountDownLatch的基本用法 2.1 创建CountDownLatch对象 2.2 await()方法 ...CountDownLatch与CyclicBarrier的对比 最佳实践与注意事项
CyclicBarrier类似于CountDownLatch也是个计数器,不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续...
7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、线程池原理和如何使用线程池 9、ThreadLocal 为什么会内存泄漏 10、Volatile底层实现原理 11、AQS源码分析 12、CAS原理分析和使用场景 13、...
Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。