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();
}
}
}
相关推荐
前端世界13 分钟前
当网络里混入“假网关”:用 Scapy 写一个 DHCP 欺骗检测器(附完整代码与讲解)
开发语言·网络·php
l1t14 分钟前
Duckdb rusty_sheet插件使用心得
数据库·sql·lua·duckdb·rusty_sheet
千里镜宵烛14 分钟前
Lua-编译,执行和错误
开发语言·lua
asdfsdgss20 分钟前
PostgreSQL 教程:json 与 jsonb 的数据验证机制差异及实战选择
数据库·postgresql·json
座山雕~24 分钟前
MYSQL-超全基础以及用法--仅个人的速记笔记(1)
数据库·mysql
赵谨言25 分钟前
基于python二手车价值评估系统的设计与实现
大数据·开发语言·经验分享·python
喜欢读源码的小白29 分钟前
Spring Boot+MyBatis实现无限层级组织架构设计|邻接表vs闭包表性能对比|树形结构数据存储方案
java·数据库·组织结构·树级层级·无线层级
安当加密38 分钟前
基于ASP身份认证服务器实现远程办公VPN双因素认证的架构与实践
java·服务器·架构
ysdysyn1 小时前
Java奇幻漂流:从Spring秘境到微服务星辰的冒险指南
java·spring·微服务
FJW0208141 小时前
关系型数据库大王Mysql——DML语句操作示例
数据库·mysql