`
cunzhangok
  • 浏览: 66337 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

CountDownLatch 与 CyclicBarrier 区分 一篇不错的文章

 
阅读更多
先说两点都知道的:
1.CountDownLatch减计数,CyclicBarrier加计数。
2.CountDownLatch是一次性的,CyclicBarrier可以重用。

然后我们用被大家说烂了的跑步的例子继续说事儿:

1. 有五个人,一个裁判。这五个人同时跑,裁判开始计时,五个人都到终点了,裁判喊停,然后统计这五个人从开始跑到最后一个撞线用了多长时间。

Java代码 
import java.util.concurrent.CountDownLatch; 
 
public class Race { 
 
    public static void main(String[] args) { 
        final int num = 5; 
        final CountDownLatch begin = new CountDownLatch(1); 
        final CountDownLatch end = new CountDownLatch(num); 
 
        for (int i = 0; i < num; i++) { 
            new Thread(new AWorker(i, begin, end)).start(); 
        } 
 
        // judge prepare... 
        try { 
            Thread.sleep((long) (Math.random() * 5000)); 
        } catch (InterruptedException e1) { 
            e1.printStackTrace(); 
        } 
 
        System.out.println("judge say : run !"); 
        begin.countDown(); 
        long startTime = System.currentTimeMillis(); 
 
        try { 
            end.await(); 
        } catch (InterruptedException e) { 
            e.printStackTrace(); 
        } finally { 
            long endTime = System.currentTimeMillis(); 
            System.out.println("judge say : all arrived !"); 
            System.out.println("spend time: " + (endTime - startTime)); 
        } 
 
    } 
 

 
class AWorker implements Runnable { 
    final CountDownLatch begin; 
    final CountDownLatch end; 
    final int id; 
 
    public AWorker(final int id, final CountDownLatch begin, 
            final CountDownLatch end) { 
        this.id = id; 
        this.begin = begin; 
        this.end = end; 
    } 
 
    @Override 
    public void run() { 
        try { 
            System.out.println(this.id + " ready !"); 
            begin.await(); 
            // run... 
            Thread.sleep((long) (Math.random() * 10000)); 
        } catch (Throwable e) { 
            e.printStackTrace(); 
        } finally { 
            System.out.println(this.id + " arrived !"); 
            end.countDown(); 
        } 
    } 
 



CountDownLatch强调的是一个线程(或多个)需要等待另外的n个线程干完某件事情之后才能继续执行。 上述例子,main线程是裁判,5个AWorker是跑步的。运动员先准备,裁判喊跑,运动员才开始跑(这是第一次同步,对应begin)。5个人谁跑到终点了,countdown一下,直到5个人全部到达,裁判喊停(这是第二次同步,对应end),然后算时间。

2. 继续,还是这五个人(这五个人真无聊..),这次没裁判。规定五个人只要都跑到终点了,大家可以喝啤酒。但是,只要有一个人没到终点,就不能喝。 这里也没有要求大家要同时起跑(当然也可以,加latch)。

Java代码 
import java.util.concurrent.BrokenBarrierException; 
import java.util.concurrent.CyclicBarrier; 
 
public class Beer { 
 
    public static void main(String[] args) { 
        final int count = 5; 
        final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable() { 
            @Override 
            public void run() { 
                System.out.println("drink beer!"); 
            } 
        }); 
 
        // they do not have to start at the same time... 
        for (int i = 0; i < count; i++) { 
            new Thread(new Worker(i, barrier)).start(); 
        } 
    } 
 

 
class Worker implements Runnable { 
    final int id; 
    final CyclicBarrier barrier; 
 
    public Worker(final int id, final CyclicBarrier barrier) { 
        this.id = id; 
        this.barrier = barrier; 
    } 
 
    @Override 
    public void run() { 
        try { 
            System.out.println(this.id + "starts to run !"); 
            Thread.sleep((long) (Math.random() * 10000)); 
            System.out.println(this.id + "arrived !"); 
            this.barrier.await(); 
        } catch (InterruptedException e) { 
            e.printStackTrace(); 
        } catch (BrokenBarrierException e) { 
            e.printStackTrace(); 
        } 
    } 



CyclicBarrier强调的是n个线程,大家相互等待,只要有一个没完成,所有人都得等着。正如上例,只有5个人全部跑到终点,大家才能开喝,否则只能全等着。

再强调下,CountDownLatch强调一个线程等多个线程完成某件事情。CyclicBarrier是多个线程互等,等大家都完成。
分享到:
评论

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

    与CountDownLatch不同,CyclicBarrier可以重置,因此可以多次使用。 1. **初始化**: 通过`CyclicBarrier(int parties, Runnable barrierAction)`构造函数初始化,`parties`表示需要等待的线程数量,`barrierAction`...

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

    CountDownLatch适用于需要等待一组操作完成的场景,而CyclicBarrier适用于需要多个线程协同工作,直到所有线程都到达某个公共点后再一起执行的场景。在实际开发中,我们应该根据具体的应用场景选择合适的同步工具,...

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

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

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

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent包下的类,为多线程编程提供了强大的支持。 **CountDownLatch** 是一个...

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

    CountDownLatch 适用于“一个或多个线程等待其他线程完成任务”的场景,而 CyclicBarrier 更适合于“一组线程相互等待”的场景。通过了解它们的实现原理和应用场景,开发者可以更好地选择合适的工具来满足自己的需求...

    CountDownLatch、CyclicBarrier、Semaphore.md

    java 高并发应用场景

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

    与CountDownLatch不同,CyclicBarrier允许一组线程在达到某个预设的阈值(barrier点)时一起继续执行。CyclicBarrier的内部实现使用了ReentrantLock和Condition。它的核心概念是“代”,每个使用CyclicBarrier的事件...

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

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

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    在Java并发编程中,CountDownLatch、CyclicBarrier和Semaphore是三种重要的线程协作工具,它们都基于AbstractQueuedSynchronizer(AQS)框架来实现线程间的同步和协调。AQS是一个内置的锁和同步组件,它为构建高级...

    Java并发编程之美_部分71

    本节主要讲解了Java并发包中线程同步器原理剖析,具体来说是 CountDownLatch 和 CyclicBarrier 的使用和原理剖析。 一、CountDownLatch CountDownLatch 是一个同步工具,它可以让一个线程等待其他线程完成某些操作...

    CountDownLatch练习

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

    Java中的CountDownLatch类最全讲义

    目录: 简介 1.1 并发编程与线程同步 1.2 CountDownLatch概述 CountDownLatch的基本用法 2.1 创建CountDownLatch对象 2.2 await()方法 ...CountDownLatch与CyclicBarrier的对比 最佳实践与注意事项

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

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

    CountDownLatch与thread.join()的区别

    CountDownLatch与thread.join()的区别

    JUC面试知识点手册快速版

    第一章:Java并发简介 1.1 什么是并发编程 1.2 Java中的并发编程模型 1.3 线程的生命周期 第二章:基础同步工具 2.1 synchronized关键字 2.2 volatile关键字 第三章:锁机制 3.1 ReentrantLock 3.2 ...

    CyclicBarrier用法.docx

    1. **重复使用性**:与CountDownLatch不同,CyclicBarrier可以在所有线程都达到屏障点后重置,允许再次使用。这意味着一旦所有线程都完成各自的任务并调用await()方法,屏障将被重置,计数器恢复到初始值,可以进行...

    Java并发编程-3.pdf

    在上面的代码中,我们创建了一个 CountDownLatch 对象,初始值为 100,然后启动一个线程,每次 countDown() 减少一个计数,直到计数为 0 时,main 线程才会继续执行。 2. CyclicBarrier CyclicBarrier 是一种同步...

    Java线程核心技术及常见面试问题解答

    内容概要:本文详细介绍了Java线程的基本概念、线程的安全与同步机制、多种线程间通信方式、Java内存模型,以及线程池的原理与使用技巧... 适合人群:面向有一定Java基础的开发者和面试准备者。...

    多线程countDownLatch方法介绍

    总之,CountDownLatch是Java多线程编程中的一个重要工具,通过它可以实现线程间的同步与协作,有效地解决了多线程环境下任务的同步问题。理解其工作原理和应用场景,能帮助开发者更好地设计和优化并发程序。

Global site tag (gtag.js) - Google Analytics