`

CyclicBarrier和CountDownLatch的区别

 
阅读更多

从网上搜到的文章,在讲到这两者的区别时,大多都引用了以下两句话:

(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的计数器可以被循环使用,一次循环结束后,可以继续给下一次的循环使用。

 

以上是根据之前试验得出来的两者之间在使用上的差别,至于其他方面还有什么差别,暂时没有深入研究,后面有时间再继续吧。

分享到:
评论

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...

    Java中的CountDownLatch与CyclicBarrier:深入理解与应用实践

    在Java的并发编程中,CountDownLatch和CyclicBarrier是两个非常重要的同步工具,它们用于协调多个线程的执行顺序。本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。...

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

    总结一下,CountDownLatch和CyclicBarrier的主要区别在于: - **CountDownLatch** 是单次使用的,一旦计数器归零,就不能再复用。 - **CyclicBarrier** 可以重用,线程到达屏障点后,屏障会自动重置,允许线程再次...

    CountDownLatch 和 CyclicBarrier 的运用(含AQS详解)

    ### CountDownLatch 和 CyclicBarrier 的运用(含AQS详解) #### CountDownLatch **定义与特点:** CountDownLatch 是 Java 并发包中的一个重要组件,它主要用于解决“一个或多个线程等待其他线程完成任务”的问题。...

    详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别

    在Java并发编程中,CountDownLatch和CyclicBarrier都是用于协调多线程间同步的重要工具,它们可以帮助开发者在特定条件满足时启动或者结束线程的执行。本文将详细探讨这两个类的内部实现机制以及它们在实际应用场景...

    线程实例(并发库引入到Java标准库 )

    有以下类的实例: ThreadPool ScheduledThread CyclicBarrier BlockingQueue CountDownLatch FutureTask CompletionService Semaphore

    《Java并发编程艺术》高清带目录中文版

    本书将引领读者探索Java提供的各种并发工具和API,如线程、守护线程、线程池、同步机制(如synchronized和volatile)、并发集合类、Future接口以及CyclicBarrier和CountDownLatch等协调机制。 书中的内容通常包括...

    CountDownLatch练习

    1. **CountDownLatch与CyclicBarrier的区别**:CountDownLatch是一次性的,计数到零后无法重用;CyclicBarrier可以重置,允许多次同步点。 2. **如何避免死锁与饥饿**:在使用CountDownLatch时,要确保所有线程都能...

    28 人齐了,一起行动—CyclicBarrier详解.pdf

    CyclicBarrier 是 Java 并发库中的一种同步工具类...在设计多线程应用时,根据具体需求选择合适的同步工具,如 CyclicBarrier、CountDownLatch 或 Semaphores,可以有效地避免竞态条件和死锁,提高系统的并行处理能力。

    java多线程资料

    书中还介绍了Java提供的并发工具,如Semaphore、CyclicBarrier、CountDownLatch和Phaser等,以及ExecutorService和ThreadPoolExecutor的使用,这些都是Java 5及更高版本中引入的重要并发框架。 学习这两个资源,你...

    Java concurrency之CountDownLatch原理和示例_动力节点Java学院整理

    下面我们将深入探讨CountDownLatch的原理、使用方法以及与CyclicBarrier的区别。 首先,CountDownLatch的构造函数接受一个整数参数`count`,这个值表示计数器的初始值。当这个计数器归零时,所有等待在`await()`...

    Java线程面试题Top50[参照].pdf

    * CyclicBarrier 和 CountDownLatch 都可以用来让一组线程等待其它线程 * CountdownLatch 不能重新使用,而 CyclicBarrier 可以重新使用 八、Java 内存模型是什么? * Java 内存模型规定和指引 Java 程序在不同的...

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 Java并发编程是Java语言中的一种高级技术,用于处理多线程编程中的同步问题。Java 1.5中引入了几个高效的辅助类,包括CountDownLatch、...

    个人总结40个Java多线程面试问题和答案

    5. CyclicBarrier和CountDownLatch的区别是什么? CyclicBarrier和CountDownLatch都是用来表示代码运行到某个点上的类,但是它们的使用场景和行为不同。CyclicBarrier可以唤起一个任务,CountDownLatch可以唤起多个...

    CountDownLatch、CyclicBarrier、Semaphore.md

    java 高并发应用场景

    史上最全 Java 多线程面试题及答案

    本文将深入探讨Java多线程的相关知识点,包括它的用途、创建线程的方式、start()与run()的区别、Runnable和Callable接口的差异,以及CyclicBarrier和CountDownLatch的异同。 1. **多线程的用途** - **发挥多核CPU...

    Java中的CyclicBarrier类最全讲义

    虽然`CyclicBarrier`和`CountDownLatch`都是Java并发工具包中用于实现线程间协作的工具,但它们之间存在一些关键的区别: - **用途**:`CyclicBarrier`主要用于需要多个线程同时到达一个点的情况,而`...

Global site tag (gtag.js) - Google Analytics