CyclicBarrier 和 CountDownLatch 的实现原理与代码演示

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
云原生网关 MSE Higress,422元/月
应用实时监控服务-用户体验监控,每月100OCU免费额度
简介: CyclicBarrier 和 CountDownLatch 的实现原理与代码演示

引言

在多线程编程中,我们经常会遇到一些需要线程间协同工作的场景。CyclicBarrierCountDownLatch 就是两种常用的同步工具,它们能够帮助我们实现线程间的协调和同步。本文将深入探讨这两种同步工具的实现原理,并附上代码演示。

CyclicBarrier 的实现原理

CyclicBarrier 可以用来等待一组线程到达一个共同的栅栏点,然后同时开始执行下一步任务。它的内部实现主要依靠一个计数器和一个等待队列。

当我们创建一个 CyclicBarrier 实例时,我们需要传入一个整数值,表示需要等待的线程数量。当每个线程调用 await() 方法时,计数器会递减,然后线程会进入等待状态。当计数器达到零时,所有等待的线程都会被释放,可以继续执行下一步任务,同时计数器会被重置,可以被下一轮使用。

以下是一个简化的 CyclicBarrier 实现的示例代码:

public class CyclicBarrier {
   
    private int parties;
    private int count;

    public CyclicBarrier(int parties) {
   
        this.parties = parties;
        this.count = parties;
    }

    public synchronized void await() throws InterruptedException {
   
        count--;

        if (count > 0) {
   
            this.wait();
        } else {
   
            count = parties;
            this.notifyAll();
        }
    }
}

CountDownLatch 的实现原理

CountDownLatch 是另一种线程同步工具,它允许一个或多个线程等待其他线程完成操作后再继续执行。其实现原理较为简单,主要依赖于一个计数器和线程等待机制。

在创建 CountDownLatch 实例时,需要传入一个整数值,表示需要等待的操作数。每个操作完成后,调用 countDown() 方法,计数器会递减。等待的线程可以通过调用 await() 方法来阻塞,直到计数器减到零。

以下是一个简单的 CountDownLatch 实现的示例代码:

public class CountDownLatch {
   
    private int count;

    public CountDownLatch(int count) {
   
        this.count = count;
    }

    public synchronized void countDown() {
   
        count--;

        if (count == 0) {
   
            this.notifyAll();
        }
    }

    public synchronized void await() throws InterruptedException {
   
        while (count > 0) {
   
            this.wait();
        }
    }
}

代码演示

现在让我们通过一个示例场景来演示如何使用 CyclicBarrierCountDownLatch

假设我们有一个多线程任务,需要等待所有线程都完成后再继续进行。首先,我们可以使用 CountDownLatch 来实现这个需求:

public class CountDownLatchDemo {
   
    public static void main(String[] args) throws InterruptedException {
   
        int threadCount = 3;
        CountDownLatch latch = new CountDownLatch(threadCount);

        for (int i = 0; i < threadCount; i++) {
   
            Thread thread = new Thread(() -> {
   
                // 模拟线程执行
                System.out.println("Thread " + Thread.currentThread().getId() + " is working.");
                latch.countDown();
            });
            thread.start();
        }

        latch.await();
        System.out.println("All threads have finished.");
    }
}

接下来,我们使用 CyclicBarrier 来实现一个多线程任务的同步:

public class CyclicBarrierDemo {
   
    public static void main(String[] args) throws InterruptedException {
   
        int threadCount = 3;
        CyclicBarrier barrier = new CyclicBarrier(threadCount);

        for (int i = 0; i < threadCount; i++) {
   
            Thread thread = new Thread(() -> {
   
                // 模拟线程执行
                System.out.println("Thread " + Thread.currentThread().getId() + " is working.");
                try {
   
                    barrier.await();
                } catch (InterruptedException e) {
   
                    e.printStackTrace();
                }
                System.out.println("Thread " + Thread.currentThread().getId() + " continues.");
            });
            thread.start();
        }
    }
}

结论

CyclicBarrierCountDownLatch 都是用于线程同步的重要工具,分别适用于不同的场景。CyclicBarrier 可以用于多个线程等待彼此达到一个栅栏点,然后同时继续执行,而 CountDownLatch 则用于一个或多个线程等待其他线程完成后再继续执行。了解它们的实现原理和使用方法,将有助于我们在多线程编程中更好地处理并发场景。

目录
相关文章
CountDownLatch实现原理全面解析
CountDownLatch是一个同步工具类,用来协调多个线程之间的同步(即:用于线程之间的通信而不是互斥)。它允许一个或多个线程进入等待状态,直到其他线程执行完毕后,这些等待的线程才继续执行。
|
4月前
CyclicBarrier原理
文章主要介绍了CyclicBarrier的工作原理和使用场景。CyclicBarrier适用于需要多个线程同步到达某个点后再一起继续执行的情况,它通过ReentrantLock和Condition实现了高效的线程同步机制,适合用于需要循环使用屏障点的场景。
CyclicBarrier原理
|
4月前
|
消息中间件 RocketMQ
CountDownLatch原理
文章讲述了CountDownLatch的工作原理及其用途: 1. CountDownLatch是一个简单的同步工具,用于等待一组操作完成。 2. 它通过AQS框架实现,利用共享锁模式控制线程的等待与唤醒。 3. 适用于多线程环境下,一个线程需要等待多个其他线程完成各自的任务后再继续执行的场景。
|
6月前
|
存储 并行计算 算法
深入解析Java并发库(JUC)中的Phaser:原理、应用与源码分析
深入解析Java并发库(JUC)中的Phaser:原理、应用与源码分析
|
7月前
|
数据采集 Java API
Java并发基础:CyclicBarrier全面解析!
CyclicBarrier的优点在于实现了线程间的相互等待与协同,确保所有线程在达到预定屏障点后才能继续执行,它支持屏障的重复使用,非常适合多轮次的任务同步,此外,CyclicBarrier还允许在屏障点执行特定操作,为复杂的多线程协作提供了便利。
137 3
Java并发基础:CyclicBarrier全面解析!
|
7月前
并发编程之CountDownLatch和CyclicBarrier的详细解析(带小案例)
并发编程之CountDownLatch和CyclicBarrier的详细解析(带小案例)
94 0
|
7月前
|
Java 数据库连接 mybatis
CountDownLatch(倒计时器)源码解读与使用
CountDownLatch(倒计时器)源码解读与使用
|
7月前
|
Java
CountDownLatch用法、详解
CountDownLatch用法、详解
|
7月前
|
Java
Java多线程之等待唤醒机制及案例代码演示
Java多线程之等待唤醒机制及案例代码演示