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详解
本文作者分享了一些垃圾回收器的执行过程,希望给大家参考。
|
7月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
772 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
监控 负载均衡 Java
5 大 SpringCloud 核心组件详解,8 张图彻底弄懂
本文图文详解 Spring Cloud 的五大核心组件,帮助深入理解和掌握微服务架构。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
5 大 SpringCloud 核心组件详解,8 张图彻底弄懂
|
10月前
|
人工智能 Java API
MCP客户端调用看这一篇就够了(Java版)
本文详细介绍了MCP(Model Context Protocol)客户端的开发方法,包括在没有MCP时的痛点、MCP的作用以及如何通过Spring-AI框架和原生SDK调用MCP服务。文章首先分析了MCP协议的必要性,接着分别讲解了Spring-AI框架和自研SDK的使用方式,涵盖配置LLM接口、工具注入、动态封装工具等步骤,并提供了代码示例。此外,还记录了开发过程中遇到的问题及解决办法,如版本冲突、服务连接超时等。最后,文章探讨了框架与原生SDK的选择,认为框架适合快速构建应用,而原生SDK更适合平台级开发,强调了两者结合使用的价值。
13187 33
MCP客户端调用看这一篇就够了(Java版)
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
存储 缓存 安全
深入理解 Java 内存模型(Java Memory Model, JMM)
深入理解 Java 内存模型(Java Memory Model, JMM)
1034 0
|
消息中间件 中间件 Kafka
分布式事务最全详解 ,看这篇就够了!
本文详解分布式事务的一致性及实战解决方案,包括CAP理论、BASE理论及2PC、TCC、消息队列等常见方案,助你深入理解分布式系统的核心技术。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
分布式事务最全详解 ,看这篇就够了!
|
安全 Linux 网络安全
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
138835 0
|
Java Maven Spring
如何在idea中创建Springboot项目? 手把手带你创建Springboot项目,稳!
文章详细介绍了在IDEA中创建Spring Boot项目的过程,包括选择Spring Initializr、配置项目属性、选择Spring Boot版本、导入依赖、等待依赖下载以及项目结构简介。
20411 1