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();
}
}
}
相关推荐
2301_780789663 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
ClickHouseDB4 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
第九序言T4 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
m0_639906944 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
学长毕设4 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
时间售卖铺5 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw5 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
步行cgn5 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川5 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵5 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程