聊聊java中的CountDownLatch,CyclicBarrier,Semaphore

Java 多线程6——计时器Timer的使用 + 详细代码模拟实现 + 代码优化 本篇文章带你了解多线程中的计时器,告诉你它的作用,教会你如何使用它,帮你手动代码实现计时器,并手把手带你优化代码,快进来吧! 阅读详情

CountDownLatch(倒计时器)

是什么:
CountDownLatch是Java中的一个同步工具类,它允许一个或多个线程等待其他线程完成操作。

使用场景:

  1. 当一个线程需要等待多个其他线程执行完毕后才能继续执行时,可以使用CountDownLatch。例如,启动一个服务时,主线程可能需要等待多个组件加载完毕。
  2. 实现多个线程开始执行任务的最大并行性。即多个线程在同一时刻开始执行,类似于赛跑中的发令枪响后所有选手同时起跑。

实现原理:
CountDownLatch内部维护了一个计数器,通过countDown()方法减少计数器的值,通过await()方法让线程在计数器归零之前处于等待状态。当计数器的值变为0时,所有在CountDownLatch上await()的线程将被唤醒。

CountDownLatch示例

import java.util.concurrent.CountDownLatch;  
  
public class CountDownLatchExample {  
    public static void main(String[] args) throws InterruptedException {  
        int numberOfThreads = 3;  
        CountDownLatch countDownLatch = new CountDownLatch(numberOfThreads);  
  
        for (int i = 0; i < numberOfThreads; i++) {  
            new Thread(() -> {  
                System.out.println(Thread.currentThread().getName() + " 准备完毕!");  
                countDownLatch.countDown(); // 计数器减1  
            }).start();  
        }  
  
        countDownLatch.await(); // 等待计数器归零  
        System.out.println("所有线程准备完毕,可以开始比赛了!");  
    }  
}

 示例说明:在CountDownLatchExample中,我们创建了一个倒计时门闩,初始化为3,然后启动了3个线程。每个线程在完成准备工作后调用countDown()方法,主线程通过await()方法等待所有线程准备完毕。

CyclicBarrier(循环屏障)

是什么:
CyclicBarrier也是Java中的一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达某个公共屏障点(common barrier point)后才能继续执行。

使用场景:
CyclicBarrier常用于需要多个线程相互协作,共同完成某个任务的场景。例如,一个寝室的四个人约好了去球场打球,由于四个人准备工作不同,所以约好在楼下集合,等四个人都到齐后一起出发去球场。

实现原理:
CyclicBarrier内部维护了一个计数器和一个屏障点。每当一个线程调用await()方法时,计数器的值就会减1。当计数器的值减至0时,表示所有线程都已到达屏障点,此时屏障会被打开,所有等待的线程将继续执行。CyclicBarrier还可以设置一个可选的Runnable对象,在所有线程到达屏障点时执行该对象的run()方法。

CycliBarrier示例:

import java.util.concurrent.BrokenBarrierException;  
import java.util.concurrent.CyclicBarrier;  
  
public class CyclicBarrierExample {  
    public static void main(String[] args) {  
        int numberOfThreads = 4;  
        CyclicBarrier cyclicBarrier = new CyclicBarrier(numberOfThreads);  
  
        for (int i = 0; i < numberOfThreads; i++) {  
            new Thread(() -> {  
                System.out.println(Thread.currentThread().getName() + " 已到达集合点");  
                try {  
                    cyclicBarrier.await(); // 等待所有线程到达集合点  
                } catch (InterruptedException | BrokenBarrierException e) {  
                    e.printStackTrace();  
                }  
                System.out.println(Thread.currentThread().getName() + " 出发去球场!");  
            }).start();  
        }  
    }  
}

示例说明: 在CyclicBarrierExample中,我们创建了一个循环屏障,需要4个线程到达后才能继续。每个线程在到达集合点后调用await()方法等待其他线程,当所有线程都到达后,它们将一起继续执行。

Semaphore(信号量)

是什么:
Semaphore是Java中的一个用于控制同时访问特定资源的线程数量的同步工具。

使用场景:
Semaphore主要用于那些资源有明确访问数量限制的场景,常用于限流。例如,数据库连接池、线程池或同时访问某个接口的请求数量等。通过Semaphore可以控制同时访问资源的线程数量,防止因资源过度使用而导致的系统崩溃或性能下降。

实现原理:
Semaphore内部维护了一个计数器和多个等待队列。计数器的值表示当前可用的资源数量(即信号量数量)。当线程调用acquire()方法时,会尝试获取一个信号量(即将计数器减1),如果当前没有可用的信号量,则线程会被阻塞并放入等待队列中。当其他线程释放信号量(即调用release()方法将计数器加1)时,会从等待队列中唤醒一个或多个线程来获取信号量并继续执行。这种方式可以保证对资源的有序访问和合理利用。

Semaphore示例:

import java.util.concurrent.Semaphore;  
  
public class SemaphoreExample {  
    public static void main(String[] args) {  
        int maxPermits = 2; // 最大允许同时访问的资源数量  
        Semaphore semaphore = new Semaphore(maxPermits);  
  
        for (int i = 0; i < 5; i++) {  
            new Thread(() -> {  
                try {  
                    semaphore.acquire(); // 获取一个许可  
                    System.out.println(Thread.currentThread().getName() + " 进入了停车场");  
                    Thread.sleep(1000); // 模拟停车时间  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                } finally {  
                    semaphore.release(); // 释放一个许可  
                    System.out.println(Thread.currentThread().getName() + " 离开了停车场");  
                }  
            }).start();  
        }  
    }  
}

示例说明:在SemaphoreExample中,我们创建了一个信号量,允许最多2个线程同时访问资源(这里是模拟的停车场)。每个线程在访问资源前需要调用acquire()方法获取许可,访问完成后调用release()方法释放许可。这样可以确保同时访问资源的线程数量不会超过信号量设定的最大值。

面试系列之线程篇 线程和进程? 进程是资源分配和调度的最小独立单元,线程是CPU调度的基本单元; 一个进程可以包含多个线程,多个线程共享该进程的资源; 线程可以看作是轻量级的进程; 进程间通信的方式? volatile,synchronized,wait/notifyAll,管道输入/输出流,thread.join(),ThreadLocal; 聊聊synchronized和lock? synchronized是Java中的一个关键字,通过该关键字修饰来达到同步的效果,被synchronized修饰.. 阅读详情

相关推荐

Java并发编程中的Semaphore与CountDownLatch对比

控制同时访问资源的线程数量(例如限制数据库连接池的最大连接数);等待多个子任务完成后再执行主任务(例如多线程下载文件后合并结果)。Semaphore和正是为这两种需求设计的工具。本文将深入对比它们的原理、用法和适用场景,覆盖从基础概念到实战的全流程。用生活案例引出Semaphore和的核心作用;结合源码和AQS(抽象队列同步器)讲解底层原理;通过代码示例对比两者的使用差异;总结实际开发中的选择策略。Semaphore:通过“许可”控制同时访问资源的线程数,像停车场的停车票管理器;

Java大师兄的博客 815

JavaEE(系列16) -- 多线程(信号量与CountDownLatch)

信号量和CountDownLatch

小白的博客 1547

Java并发编程系列34:CountDownLatch使用

CountDownLatch(闭锁/门阀)是一个同步协助类,允许一个或多个线程等待,直到其他线程完成 操作集。

fen_fen的专栏 1698

Java并发编程——Semaphore (信号量)和CountDownLatch

一、Semaphore (信号量) 说简单点,Semaphore维护了一个许可集合,在创建Semaphore的时候,设置上许可数,每条线程在只有在获得一个许可的时候才可以继续往下执行逻辑(申请一个许可,则Semaphore的许可池中减少一个许可),没有获得许可的线程会进入阻塞状态。 举个栗子: public static void main(String[] args) {...

h610968110的博客 3792

Xilinx的DDR4 IP

Xilinx的DDR4 IP

weixin_39896700的博客 4458

微信聊天记录数据库解密实战:从WCDB到sqlcipher4的关键步骤解析

本文详细解析了微信桌面版聊天记录数据库的解密实战过程。通过逆向分析,定位了微信从WCDB框架到sqlcipher4加密的关键步骤,并成功提取了数据库密钥。文章重点介绍了如何通过动态调试、字符串定位等方法,追踪并验证sqlcipher4的加密密钥,最终实现对加密数据库文件的解密操作,为安全研究和数据恢复提供了技术参考。

weixin_29322553的博客 1071

聊聊 JUC 下的 CountDownLatch、CyclicBarrier、Phaser 和 Semaphore

聊聊 JUC 下的 CountDownLatch、CyclicBarrier、Phaser 和 Semaphore

lybugproducer的博客 1131

第四次工业革命如何重构产业逻辑:写给技术人的趋势推演

第四次工业革命正在以人工智能、大数据和新能源为核心重构全球产业逻辑。本文从历史规律切入,指出技术革命本质是生产力跃迁和产业链话语权的转移。当前AI基础设施竞赛已形成算力、数据、算法三大支柱,其中算力投资首超石油领域,绿色算力与新型架构成为关键。数据治理带来隐私计算等新技术约束,数据中心正向液冷技术和"东数西算"模式演进。技术人需构建三大竞争力:夯实分布式系统等底层能力、培养跨领域知识融合能力、善用约束条件驱动创新。这场变革将奖励那些深度理解技术本质并能快速适应的实践者。

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 289

聊聊JAVA中的并发工具类

在JDK的并发包里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类提供了在线程间交换数据的一种方法。它们都在包下。先总体概括一下都有哪些工具类,它们有什么作用,然后再分别介绍它们的主要使用方法和原理。下面分别介绍这几个类。可以使一个或多个线程等待其他线程各自执行完毕后再执行。定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤

BASK2312的博客 436

PLS-SEM(偏最小二乘路径建模)模型拟合优度指标

PLS-SEM(偏最小二乘路径建模)是一种基于方差的分析方法,侧重于预测导向,通过迭代优化路径系数和外部权重来最大化潜变量的解释方差(R²)。其评估指标分为外部测量模型和结构模型两部分:外部测量模型关注潜变量与显变量的关系,通过标准化载荷(>0.7)、信度指标(Cronbach’s α、复合信度CR>0.7)、聚合效度(AVE>0.5)和区分效度(Fornell-Larcker标准、HTMT<0.85)来评估模型的可靠性和有效性。结构模型则检验潜变量间的因果关系,通过路径系数(β值)

wewil_lwin的博客 3231

告别龟速计算!用Python的fengwo模块5分钟搞定通达信COST/WINNER函数(附完整代码)

本文介绍如何使用Python的fengwo模块高效复现通达信的COST和WINNER函数,解决量化交易中的计算精度和性能问题。通过C++核心算法和多线程优化,计算速度提升显著,误差低于0.5%,并支持与通达信DLL无缝集成,适用于实盘交易策略开发。

weixin_42533751的博客 600

聊聊 JUC 并发包

今天开始我们聊聊 Java 并发工具包中提供的一些工具类,本文主要从并发同步容器和并发集合工具角度入手,简单介绍下相关 API 的用法与部分实现原理,旨在帮助大家更好的使用和理解 JUC 工具类。 在开始今天的内容之前,我们还需要简单回顾下线程、 syncronized 的相关知识。 Java 线程的运行周期中的几种状态, 在java.la...

a781613438的博客 351

01-SA8155 QNX 虚拟机Hypervisor

Hypervisor运行在Host OS操作系统上,其他操作系统均在Hypervisor上运行。:Hypervisor直接运行在硬件上,操作系统在Hypervisor之上运行。终止(关闭):echo control 0 dev/vmm。路径:qnx_ap/AMSS/platform/vm/resources/关闭/终止 qvm(GVM):slay -s SIGQUIT qvm。", //host PVM --- 主机。不直接操作/dev/vmm 实现关闭,启动vm。

静虚待令,有物混成 1万+

聊聊并发编程——Condition

并发编程之condition

Elaine2391的博客 469

Qt C++ 串口调试助手

1. **串口配置**:支持自动检测可用串口,可配置波特率(9600~921600)、数据位(5~8)、校验位(无/奇/偶/标记/空格)、停止位(1/1.5/2)。- HEX 模式发送时,输入格式需为十六进制字符(0-9、A-F),可带空格(如 `01 A3 FF`)或不带空格(如 `01A3FF`)。// 发送模式:true=HEX,false=ASCII。// 字符串转HEX字节数组。ui->parity->addItems({"无", "奇校验", "偶校验", "标记校验", "空格校验"});

寒寒豆豆软件公司的博客 147

Allegro孔和线被做到器件里面如何解锁操作指导

在做PCB设计的时候,会遇到孔和线被做到器件的情况,当需要移动器件的时候,孔和线也会跟着移动。孔和线被做到器件里面如何解锁操作指导。

weixin_54787054的博客 1144

Java中的并发编程:深入分析线程池与并发工具的使用场景

Java中的并发编程:深入分析线程池与并发工具的使用场景 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来聊聊Java中的并发编程,特别是线程池和并发工具的使用场景。在现代高并发的应用中,合理使用线程池和并发工具不仅能提升性能,还能有效管理系统资源。本文将深入探讨这些工具的使用技巧及其适用场景。 1. 线程池:控制线程的创建与管理 线程池是Java并发编程中最常用的工具之一,它能够控制线程的创建、复用和销毁,避免因频繁创建线程而带来的性能开销。ExecutorSe

技术研究中心 772

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java线程同步机制

Semaphore是基于计数的同步工具,它可以维护一组许可证(Permits)。如果你想要访问一个资源,就必须先从信号量获取一个许可证。如果信号量中没有许可证可用了,那么请求许可证的线程就必须等待,直到有其他线程释放许可证。想象一下,你在一个拥挤的餐厅等待座位。餐厅只有一定数量的座位(许可证),如果座位满了,就得等别人用完餐离开,你才能坐下。这就是信号量的工作方式。Semaphore:简单易用,但在某些情况下可能导致效率问题,如过长的等待时间或死锁。锁(Locks):比。

宋小黑的博客 999

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

玩转JUC - 闲聊并发包中那些好用的工具类

本篇文章我们主要学习Java 并发包中的一些工具类。主要内容包括 原子类、Lock、Condition 以及 线程间协作的  CountDownLatch、CyclicBarrier、Semaphore、Exchanger 和 Phaser 等内容,本篇文章主要介绍如何使用,后续我们会进一步分析原理。

代码洁癖症患者 1万+

JUC的那些同步锁们

JUC的那些同步锁们ReadWriteLockCountDownLatchCyclicBarrierSemaphoreExchanger ReadWriteLock 实际情况中,对于数据往往百分之80都是在进行读的操作,那么如果还使用互斥锁,即每个线程在执行的时候,其他线程只能等待,这样效率会非常低下,因此产生了ReadWriteLock(读写锁)。其中读锁是共享锁,写锁时排它锁(互斥锁),读写锁的本质是提高了读的效率。 如下代码: public class ReadAndWrite { publi

szy2333的博客 463

【潜意识Java】深度剖析Java并发工具包

家人们,今天来聊聊 Java 并发编程里的 “秘密武器”—— 并发工具包(java.util.concurrent)。在多线程编程时,处理线程间的协作、同步和资源共享特别麻烦,这个工具包就像百宝箱,提供了各种强大工具,能帮我们轻松解决这些难题,极大提升程序性能和稳定性。

潜意识Java的博客 474

Java基础-JUC篇-上

Java基础 两句题外话,自己复习整理的知识点,准备发出来分享给大家。有不足之处还望不吝赐教,都是自己手打,难免有错别字,担待,谢谢各位! JUC 1. 谈谈对volatile的理解 ① 保证可见性 ② 不保证原子性 ③ 禁止指令重排序 ④ volatile的原理和实现机制:观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令。内存屏障 ⑤ volatile修饰的变量如果被修改会被强制立即写入主存,但是当前线程被

Always_zh的博客 660

java基础复习(八):聊聊synchronized和Lock/AQS

文章目录对线程安全问题的思考解构i++什么是同步和互斥线程通信为什么需要同步线程安全问题的解决方案加锁乐观锁与悲观锁无锁线程隔离threadLocal基本原理内存泄露问题Java内存模型原子/可见/有序问题的产生as-if-serial原则happens-before规则缓存一致性协议MESI缓存行总线嗅探CAS自旋锁(轻量级锁)无锁CAS存在的问题版本号CAS的内存语义synchronizedsynchronized的使用synchronize的内存语义jvm中的synchronizedsynchroni

qq_44793993的博客 1161

Java 并发编程中的 “锁” 事:7 种常用锁机制大白话详解

以下是对 Java 中常见的几种锁(`ReentrantLock`、`synchronized`、`StampedLock`、`ReadWriteLock`、`Semaphore`、`CountDownLatch` 和 `CyclicBarrier`)的原理和代码示例的比较:1. `ReentrantLock`(可重入锁)当一个线程获取到 `synchronized` 修饰的代码块或方法的锁时,其他线程会被阻塞等待。这些锁机制在不同的场景下有不同的用途,选择合适的锁取决于具体的并发需求和性能要求。

m0_57836225的博客 521

确保线程安全?这几个方法让你轻松过Java面试!

在Java多线程开发中,线程安全是核心考点!本文将从同步机制、原子变量、不可变对象和锁优化等角度,深入剖析确保线程安全的关键技术与实战技巧。掌握这些方法不仅能让你轻松应对面试挑战,更能提升代码质量和系统稳定性。快来学习这些实用技巧吧!

yanpeng2580的博客 915
上一篇: 聊一聊java中synchronized的实现原理
下一篇: 聊一聊java中的HashMap,ConcurrentHashMap以及Collections.SynchronizedMap
Jack_abu
博客等级 码龄10年 633粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack_abu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值