高级java每日一道面试题-2025年01月04日-并发篇-说说CyclicBarrier和CountDownLatch的区别?

news/2025/1/10 12:45:53/

如果有遗漏,评论区告诉我进行补充

CyclicBarrierCountDownLatch_1">面试官: 说说CyclicBarrierCountDownLatch的区别?

我回答:

在Java高级面试中,CyclicBarrierCountDownLatch是两个经常被提及的并发工具类,它们都用于实现线程间的同步,但存在显著的区别。以下是对这两个类的详细比较:

一、计数器使用方式的区别

  1. CountDownLatch

    • 是一个减法计数器。
    • 计数器一旦初始化,只能递减,不能重置或增加。
    • 当计数器的值减至零时,所有因调用await()方法而被阻塞的线程会被唤醒,继续执行。
  2. CyclicBarrier

    • 可以理解为加法计数器,但其实际工作机制并非简单的加法。
    • 计数器可以重复使用,通过reset()方法重置。
    • 当指定数量的线程都调用了await()方法时,这些线程会被同时唤醒,继续执行。此时,计数器会重置为初始值,以便下一轮使用。

二、等待和继续执行的方式

  1. CountDownLatch

    • 主要用于一个或多个线程等待其他线程完成某项任务。
    • 只有当所有需要等待的线程都完成任务(即计数器减至零),被阻塞的线程才能继续执行。
  2. CyclicBarrier

    • 用于一组线程互相等待,直到所有线程都到达某个公共屏障点。
    • 一旦所有线程都到达屏障点,它们会同时被唤醒并继续执行。
    • 由于CyclicBarrier的计数器可以重置,因此它适用于需要多次等待和同步的场景。

三、异常处理

  1. CountDownLatch

    • 计数器的递减操作(countDown())可能会抛出异常,但这些异常不会影响其他线程的执行。
  2. CyclicBarrier

    • 在调用await()方法时可能会抛出异常(如BrokenBarrierException),此时需要使用try-catch块来捕获和处理这些异常。

四、主要区别

是否可复用
  • CountDownLatch:不可复用。一旦计数值达到了0,该 CountDownLatch 就不能再被重置或再次使用。

  • CyclicBarrier:可复用。每当所有线程都到达屏障点后,它可以自动重置并重新开始计数,以便下一轮的线程再次等待。

初始化参数
  • CountDownLatch:仅需指定一个初始计数值,代表需要等待的事件数量。
  • CyclicBarrier:除了指定参与者数量外,还可以提供一个 Runnable 对象作为屏障动作(barrier action),这个动作会在所有线程到达屏障点之后、但在任何线程继续执行之前被执行。
等待行为
  • CountDownLatch:主线程或其他线程可以通过 await() 方法等待,直到计数值变为0。

  • CyclicBarrier:每个线程通过 await() 方法等待,直到所有线程都到达屏障点;如果某个线程提前离开(例如因为异常),则其他线程会抛出 BrokenBarrierException

超时机制
  • CountDownLatch:没有内置的超时机制,但如果使用带超时参数的 await(long timeout, TimeUnit unit) 方法,则可以在指定时间内尝试等待。

  • CyclicBarrier:支持带超时的 await(long timeout, TimeUnit unit) 方法,允许设置最大等待时间,超过此时间如果没有所有线程到达屏障点,则抛出 TimeoutException

五、使用场景

  1. CountDownLatch

    • 适用于主线程等待所有子线程完成任务后再继续执行的场景。
    • 适用于统计多个线程执行时间的场景。
  2. CyclicBarrier

    • 适用于多个线程需要互相等待,并在某个公共点上同步执行的场景。
    • 适用于需要多次等待和同步的周期性任务场景。

http://www.ppmy.cn/news/1561980.html

相关文章

深度学习中的卷积和反卷积(二)——反卷积的介绍

1 简介 反卷积(deconvolution)又称转置卷积,是卷积的拟操作,常用于GAN等模型中。反卷积是上采样的一种,上采样是指将特征图维度恢复到原始图的维度,这种增大维度的过程被称为上采样。上采样可以用插值或反…

linux音视频采集技术: v4l2

简介 在 Linux 系统中,视频设备的支持和管理离不开 V4L2(Video for Linux 2)。作为 Linux 内核的一部分,V4L2 提供了一套统一的接口,允许开发者与视频设备(如摄像头、视频采集卡等)进行交互。无…

毕业项目推荐:基于yolov8/yolov5/yolo11的动物检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

JetBrains IDEs和Visual Studio Code的对比

JetBrains IDEs和Visual Studio Code的对比 JetBrains IDEs是捷克JetBrains公司开发的一系列集成开发环境(IDE)。以下是具体介绍:IntelliJ IDEA是JetBrains 公司的一款产品 主要产品 IntelliJ IDEA:一款功能强大且广泛应用的Java集成开发环境,有开源免费的社区版和商业收…

linux 使用 MySQL Performance Schema 和 Prometheus + Grafana 来监控 MySQL 性能

🎯 方案 1:使用 MySQL Performance Schema Performance Schema 是 MySQL 内置的性能监控工具,适合排查慢查询、锁等待、资源使用等问题。 ✅ 步骤 1:启用 Performance Schema 1️⃣ 在 MySQL 配置文件中(通常是 /et…

DAY39|动态规划Part07|LeetCode:198.打家劫舍、213.打家劫舍II、337.打家劫舍III

目录 LeetCode:198.打家劫舍 基本思路 C代码 LeetCode:213.打家劫舍II 基本思路 C代码 LeetCode:337.打家劫舍III 基本思路 C代码 LeetCode:198.打家劫舍 力扣题目链接 文字讲解:LeetCode:198.打家劫舍 视频讲解:动态规划,偷不偷这个…

Ubuntu 18.04 解决screen无法滚屏的问题

Ubuntu 18.04 解决screen无法滚屏的问题_ubuntu screen 无法上滑-CSDN博客文章浏览阅读2.7k次,点赞2次,收藏3次。在etc/screenrc中加入termcapinfo xterm* ti:te重新进入screen的sessionscreen -d -r XXX_ubuntu screen 无法上滑https://blog.csdn.net/w…

RK3568平台(USB篇)禁用USB端口

一.linux中怎样查看usb的端口号 在USB口插入U盘: [ 198.141319][ T106] usb 3-1.3: new SuperSpeed Gen 1 USB device number 5 using xhci-hcd [ 198.161695][ T106] usb 3-1.3: New USB device found, idVendor=0781, idProduct=5591, bcdDevice= 1.00 [ 198.161721]…