CountDownLatch和CyclicBarrier的区别【含面试题】

AI绘画关于SD,MJ,GPT,SDXL百科全书

面试题分享点我直达

2023最新面试合集链接

2023大厂面试题PDF

面试题PDF版本

java、python面试题

项目实战:AI文本 OCR识别最佳实践

AI Gamma一键生成PPT工具直达链接

玩转cloud Studio 在线编码神器

玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间

史上最全文档AI绘画stablediffusion资料分享

AI绘画 stable diffusion Midjourney 官方GPT文档 AIGC百科全书资料收集

AIGC资料包

引言

在并发编程中,我们经常会遇到需要多个线程协同工作的场景。Java提供了两个非常有用的工具类,即CountDownLatch和CyclicBarrier,用于实现线程之间的同步和协作。本文将介绍这两个工具类的区别,并提供相应的代码示例。

  1. CountDownLatch
    CountDownLatch是一个同步辅助类,它允许一个或多个线程等待其他线程完成操作后再继续执行。它的主要特点如下:
  • CountDownLatch内部维护了一个计数器,初始值为指定的数量。
  • 当一个线程完成了自己的任务后,可以调用countDown()方法将计数器减1。
  • 当计数器的值变为0时,所有等待的线程将被唤醒,可以继续执行。

下面是一个使用CountDownLatch的示例代码:

在上述代码中,我们创建了一个CountDownLatch对象,并将计数器的初始值设置为5。然后创建了5个线程,每个线程执行一个模拟任务,并在任务完成后调用countDown()方法将计数器减1。最后,主线程调用await()方法等待计数器变为0,即所有线程都完成任务后才继续执行。

  1. CyclicBarrier

CyclicBarrier也是一个同步辅助类,它允许一组线程相互等待,直到所有线程都到达某个公共屏障点后再继续执行。它的主要特点如下:

  • CyclicBarrier内部维护了一个计数器和一个屏障点。
  • 当一个线程到达屏障点时,会调用await()方法等待其他线程。
  • 当所有线程都到达屏障点时,所有等待的线程将被唤醒,可以继续执行。

下面是一个使用CyclicBarrier的示例代码:

在上述代码中,我们创建了一个CyclicBarrier对象,并将参与线程的数量设置为5。然后创建了5个线程,每个线程执行一个模拟任务,并在任务执行完后调用await()方法等待其他线程到达屏障点。当所有线程都到达屏障点后,会

Your response got cut off, because you only have limited response space. Continue writing exactly where you left off. Do not repeat yourself. Start your response with: ")`方法等待其他线程到达屏障点。当所有线程都到达屏障点后,会", though use backticks where appropriate

USED

Rerun without context

方法等待其他线程到达屏障点。当所有线程都到达屏障点后,会执行传入CyclicBarrier构造函数的Runnable对象,然后所有等待的线程将被唤醒,可以继续执行。

3. 区别对比

虽然CountDownLatch和CyclicBarrier都可以用于线程之间的同步和协作,但它们在使用方式和功能上有一些区别。

  • CountDownLatch的计数器只能减少,一旦减到0就不能再增加。而CyclicBarrier的计数器可以循环使用,当计数器减到0时会被重置为初始值。
  • CountDownLatch适用于一组线程等待另一组线程完成任务后再继续执行的场景。而CyclicBarrier适用于一组线程相互等待,直到所有线程都到达某个公共屏障点后再继续执行的场景。
  • CountDownLatch的计数器是递减的,而CyclicBarrier的计数器是递增的。
  • CountDownLatch没有屏障点的概念,所有等待的线程都会被唤醒。而CyclicBarrier有一个屏障点,只有当所有线程都到达屏障点时才会执行指定的动作。

代码示例

CountDownLatch示例代码

复制代码
java
import java.util.concurrent.CountDownLatch;

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

for (int i = 0; i < threadCount; i++) {
Thread thread = new Thread(() -> {
// 模拟线程执行任务
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread finished");
latch.countDown(); // 计数器减1
});
thread.start();
}

latch.await(); // 等待计数器变为0
System.out.println("All threads finished");
}
}
java
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierExample {
public static void main(String[] args) {
int threadCount = 5;
CyclicBarrier barrier = new CyclicBarrier(threadCount, () -> {
System.out.println("All threads reached the barrier");
});

for (int i = 0; i < threadCount; i++) {
Thread thread = new Thread(() -> {
// 模拟线程执行任务
try {
Thread.sleep(1000);
System.out.println("Thread reached the barrier");
barrier.await(); // 等待其他线程到达屏障点
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("Thread continued");
});
thread.start();
}
}
}
相关推荐
半新半旧10 分钟前
Redis集群和 zookeeper 实现分布式锁的优势和劣势
redis·分布式·zookeeper
运器12314 分钟前
【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
开发语言·人工智能·python·算法·ai·散列表·ai编程
岁忧14 分钟前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
YuTaoShao17 分钟前
【LeetCode 热题 100】240. 搜索二维矩阵 II——排除法
java·算法·leetcode
1024小神24 分钟前
hono框架绑定cloudflare的d1数据库操作步骤
数据库
whoarethenext29 分钟前
使用 C++ 实现 MFCC 特征提取与说话人识别系统
开发语言·c++·语音识别·mfcc
ITfeib39 分钟前
Flutter
开发语言·javascript·flutter
考虑考虑1 小时前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干1 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
Owen_Q2 小时前
Denso Create Programming Contest 2025(AtCoder Beginner Contest 413)
开发语言·算法·职场和发展