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();
}
}
}
相关推荐
晚霞的不甘2 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
SunnyDays10112 小时前
使用 Java 冻结 Excel 行和列:完整指南
java·冻结excel行和列
R_.L2 小时前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
Zach_yuan2 小时前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
摇滚侠2 小时前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea
云姜.2 小时前
java多态
java·开发语言·c++
李堇2 小时前
android滚动列表VerticalRollingTextView
android·java
Re.不晚2 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
CoderCodingNo2 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
陳10302 小时前
C++:红黑树
开发语言·c++