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在没有许可时会阻塞线程。

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

相关文章
|
6月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
672 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
存储 Java
JAVA字符串与其他类型数据的转换
JAVA字符串与其他类型数据的转换
503 4
|
监控 负载均衡 Java
5 大 SpringCloud 核心组件详解,8 张图彻底弄懂
本文图文详解 Spring Cloud 的五大核心组件,帮助深入理解和掌握微服务架构。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
5 大 SpringCloud 核心组件详解,8 张图彻底弄懂
|
缓存 算法 Java
底层原理:垃圾回收算法是如何设计的?
理解Java虚拟机垃圾回收机制的底层原理,是成为一个高级Java开发者的基本功。本文从底层的垃圾回收算法开始,着重去阐释不同垃圾回收器在算法设计和实现时的一些技术细节,去探索「why」这一部分,通过对比不同的垃圾回收算法和其实现,进一步感知目前垃圾回收的发展脉络。
15214 2
底层原理:垃圾回收算法是如何设计的?
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
存储 缓存 安全
深入理解 Java 内存模型(Java Memory Model, JMM)
深入理解 Java 内存模型(Java Memory Model, JMM)
1007 0
|
XML Java 程序员
保姆级教程,手把手教你实现SpringBoot自定义starter
保姆级教程,手把手教你实现SpringBoot自定义starter
14187 2
保姆级教程,手把手教你实现SpringBoot自定义starter
|
存储 Java C++
JVM内存模型和结构详解(五大模型图解)
JVM内存模型和结构详解(五大模型图解)
|
缓存 安全 算法
JUC第四讲:Java中的锁/CAS原理与案例分析(上)
JUC第四讲:Java中的锁/CAS原理与案例分析
243 0
JUC第四讲:Java中的锁/CAS原理与案例分析(上)
|
运维 监控 Java
Spring Boot应用的性能监控与优化指南
Spring Boot应用的性能监控与优化指南