CountDownLatch、CyclicBarrier和Semaphore原理和区别

简介: CountDownLatch、CyclicBarrier和Semaphore

CountDownLatchCyclicBarrierSemaphore是Java并发包java.util.concurrent中提供的三种同步辅助工具,它们用于控制线程间的协调。

CountDownLatch

CountDownLatch是一个同步辅助工具,它允许一个或多个线程等待一组操作完成。

原理

  • 它内部维护一个计数器,初始值由构造函数传入。
  • 通过countDown()方法递减计数器。
  • 通过await()方法阻塞等待计数器归零。

就像一场赛车比赛,裁判(主线程)在等待所有赛车(工作线程)都到达终点(countDown())后才能宣布比赛结束(await())。

使用场景

  • 用于某个固定时刻只有当所有任务都执行完毕后,才能继续执行后续的任务。

CyclicBarrier

CyclicBarrier是一个同步辅助工具,它允许一组线程相互等待,直到所有线程都到达某个公共屏障点。

原理

  • 它内部同样维护一个计数器,当线程到达屏障时计数器递减。
  • 线程调用await()方法时,如果计数器还没到零,则线程会被阻塞。
  • 当所有线程都到达屏障点后,计数器归零,所有线程都会被唤醒。

就像一群朋友约定在某个地方集合,所有人到齐后才能一起出发去下一个目的地。

使用场景

  • 用于需要周期性执行的任务,比如多线程分批处理数据。

Semaphore

Semaphore是一个计数信号量,用于限制对资源的访问。

原理

  • 它内部维护一个许可集合,线程可以通过acquire()方法获取许可。
  • 如果没有许可,则线程会被阻塞。
  • 线程使用完毕后,通过release()方法释放许可。

就像一个停车场,有固定数量的停车位,车辆(线程)需要先获取停车许可(acquire())才能停车,离开时释放停车位(release())。

使用场景

  • 用于限制对资源的并发访问数量,比如数据库连接池。

区别

  1. 用途

    • CountDownLatch用于一次性操作,不能重用。
    • CyclicBarrier可以重复使用,适用于多次的同步操作。
    • Semaphore用于控制资源的并发访问。
  2. 功能

    • CountDownLatch只能减少计数,不能增加。
    • CyclicBarrier可以在每次完成后重置计数。
    • Semaphore的计数可以增加也可以减少。
  3. 灵活性

    • CountDownLatch一旦构造,计数就固定了。
    • CyclicBarrierSemaphore在运行时可以动态地获取和释放许可。
  4. 阻塞策略

    • CountDownLatchCyclicBarrier在计数器未达到条件时会阻塞线程。
    • Semaphore在没有许可时会阻塞线程。

这些工具在并发编程中非常有用,它们帮助开发者控制线程间的协作和同步,以确保程序的正确性和性能。

相关文章
|
存储 算法 Oracle
极致八股文之JVM垃圾回收器G1&ZGC详解
本文作者分享了一些垃圾回收器的执行过程,希望给大家参考。
|
机器学习/深度学习 自然语言处理 算法
浅述几种文本和图像数据增强的方法
在现实场景中,我们往往收集不到太多的数据,那么为了扩大数据集,可以采用数据增强手段来增加样本,那么平常我们应该怎么做数据增强的呢? 什么是数据增强 数据增强也叫数据扩增,意思是在不实质性的增加数据的情况下,让有限的数据产生等价于更多数据的价值。
|
缓存 Java 开发者
【Spring】原理:Bean的作用域与生命周期
本文将围绕 Spring Bean 的作用域与生命周期展开深度剖析,系统梳理作用域的类型与应用场景、生命周期的关键阶段与扩展点,并结合实际案例揭示其底层实现原理,为开发者提供从理论到实践的完整指导。
1149 22
|
6月前
|
XML Java 数据安全/隐私保护
彻底搞懂 Spring Boot 自动配置原理:从源码拆解到手写 Starter,零废话全干货
本文深入解析SpringBoot自动配置原理,基于SpringBoot 3.4.2版本详细拆解了自动配置的执行流程。主要内容包括:1)自动配置的本质是基于条件注解的动态JavaConfig配置类;2)核心执行流程通过AutoConfigurationImportSelector实现;3)SpringBoot 3.x采用新的自动配置注册方式;4)重点讲解了@Conditional系列条件注解的使用场景与常见坑点;5)通过开发自定义加密Starter实战演示完整实现过程。
1809 3
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
1083 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
10月前
|
运维 监控 供应链
Alibaba交易平台TMF2.0介绍
2017双11交易峰值达32.5万笔/秒,面对高并发与复杂业务需求,阿里推出TMF2.0框架,通过业务与平台分离、全链路可视化、配置化发布等创新,实现需求开发周期缩短至12天,支撑多业务快速试错与复用,构建可配置、可监控、可运维的电商技术新体系。
1300 5
Alibaba交易平台TMF2.0介绍
|
Java C++ 开发者
深入理解 Java 异常体系:Checked vs Unchecked Exception
本文深入解析Java异常体系,厘清Error、Exception与RuntimeException的关系,探讨Checked与Unchecked异常的本质区别及设计争议,并结合Spring等框架实践,给出自定义异常、异常处理等最佳实践建议,助你掌握Java异常核心逻辑。
583 7
|
人工智能 Java API
MCP客户端调用看这一篇就够了(Java版)
本文详细介绍了MCP(Model Context Protocol)客户端的开发方法,包括在没有MCP时的痛点、MCP的作用以及如何通过Spring-AI框架和原生SDK调用MCP服务。文章首先分析了MCP协议的必要性,接着分别讲解了Spring-AI框架和自研SDK的使用方式,涵盖配置LLM接口、工具注入、动态封装工具等步骤,并提供了代码示例。此外,还记录了开发过程中遇到的问题及解决办法,如版本冲突、服务连接超时等。最后,文章探讨了框架与原生SDK的选择,认为框架适合快速构建应用,而原生SDK更适合平台级开发,强调了两者结合使用的价值。
14715 33
MCP客户端调用看这一篇就够了(Java版)
|
NoSQL Redis
Redis 执行 Lua保证原子性原理
Redis 执行 Lua 保证原子性原理
1433 1
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?