当前位置: 首页 > article >正文

Java多线程实战:ReentrantLock与信号量Semaphore的5个高频使用场景解析

Java多线程实战ReentrantLock与信号量Semaphore的5个高频使用场景解析在Java并发编程领域ReentrantLock和Semaphore是两个至关重要的同步工具。它们虽然都属于JUCjava.util.concurrent包中的并发控制机制但设计理念和应用场景却存在显著差异。本文将深入剖析这两种工具在真实项目中的典型应用场景帮助开发者做出更精准的技术选型。1. 并发资源池管理资源池如数据库连接池、线程池是多线程环境中的典型共享资源。当多个线程需要从有限池中获取资源时Semaphore的计数特性使其成为天然解决方案。public class ConnectionPool { private final Semaphore semaphore; private final LinkedListConnection pool new LinkedList(); public ConnectionPool(int poolSize) { this.semaphore new Semaphore(poolSize); for(int i0; ipoolSize; i) { pool.addLast(createConnection()); } } public Connection getConnection() throws InterruptedException { semaphore.acquire(); // 获取许可 synchronized(pool) { return pool.removeFirst(); } } public void releaseConnection(Connection conn) { synchronized(pool) { pool.addLast(conn); } semaphore.release(); // 释放许可 } private Connection createConnection() { // 创建真实连接 return new MockConnection(); } }关键对比Semaphore适合控制资源访问总量ReentrantLock更适合保护资源访问的互斥性提示当资源获取需要支持超时机制时可使用tryAcquire(long timeout, TimeUnit unit)方法避免线程无限期阻塞。2. 生产者-消费者模型实现生产者-消费者问题是并发编程中的经典案例。ReentrantLock配合Condition可以实现更精细的线程间协调public class MessageQueueT { private final ReentrantLock lock new ReentrantLock(); private final Condition notFull lock.newCondition(); private final Condition notEmpty lock.newCondition(); private final QueueT queue new LinkedList(); private final int capacity; public MessageQueue(int capacity) { this.capacity capacity; } public void put(T message) throws InterruptedException { lock.lock(); try { while(queue.size() capacity) { notFull.await(); // 队列满时等待 } queue.add(message); notEmpty.signal(); // 唤醒消费者 } finally { lock.unlock(); } } public T take() throws InterruptedException { lock.lock(); try { while(queue.isEmpty()) { notEmpty.await(); // 队列空时等待 } T message queue.remove(); notFull.signal(); // 唤醒生产者 return message; } finally { lock.unlock(); } } }优势分析相比synchronizedCondition提供了更灵活的等待/通知机制单个ReentrantLock可创建多个Condition实现不同条件的精确控制支持公平锁策略避免线程饥饿问题3. 流量控制与限流在高并发系统中Semaphore常被用作简单的限流器。以下是一个基于信号量的API限流实现public class RateLimiter { private final Semaphore semaphore; private final int maxPermits; private final TimeUnit timeUnit; private ScheduledExecutorService scheduler; public RateLimiter(int maxPermits, long period, TimeUnit timeUnit) { this.semaphore new Semaphore(maxPermits); this.maxPermits maxPermits; this.timeUnit timeUnit; this.scheduler Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(() - { int current semaphore.availablePermits(); if(current maxPermits) { semaphore.release(maxPermits - current); } }, 0, period, timeUnit); } public boolean tryAcquire() { return semaphore.tryAcquire(); } public void shutdown() { scheduler.shutdown(); } }参数配置示例参数名示例值说明maxPermits100每秒最大请求数period1时间窗口长度timeUnitTimeUnit.SECONDS时间单位这种实现相比ReentrantLock的优势在于天然支持并发许可数的概念无需手动维护计数器可与定时任务无缝集成4. 分布式锁的本地模拟在无法使用Redis等分布式锁的场景下ReentrantLock可以作为本地替代方案。以下是一个支持重入的锁服务实现public class ReentrantLockService { private final ReentrantLock lock new ReentrantLock(true); // 公平锁 private final MapString, Integer lockCounts new HashMap(); private final MapString, Thread lockOwners new HashMap(); public boolean tryLock(String resourceId, long timeout) throws InterruptedException { Thread current Thread.currentThread(); if(lockOwners.get(resourceId) current) { lockCounts.put(resourceId, lockCounts.get(resourceId) 1); return true; } if(lock.tryLock(timeout, TimeUnit.MILLISECONDS)) { try { if(!lockCounts.containsKey(resourceId)) { lockOwners.put(resourceId, current); lockCounts.put(resourceId, 1); return true; } } finally { lock.unlock(); } } return false; } public void unlock(String resourceId) { Thread current Thread.currentThread(); if(lockOwners.get(resourceId) ! current) { throw new IllegalMonitorStateException(); } int count lockCounts.get(resourceId) - 1; if(count 0) { lockCounts.remove(resourceId); lockOwners.remove(resourceId); lock.unlock(); } else { lockCounts.put(resourceId, count); } } }特性对比表特性ReentrantLockSemaphore重入性支持不支持公平性可配置可配置条件等待支持不支持资源计数不支持支持中断响应支持支持5. 多阶段任务协同复杂任务往往需要多个线程分阶段协作完成。以下示例展示如何组合使用ReentrantLock和Semaphore实现阶段控制public class PhaseController { private final ReentrantLock phaseLock new ReentrantLock(); private final Condition phaseCondition phaseLock.newCondition(); private final Semaphore workerSemaphore; private volatile int currentPhase 0; private final int maxWorkers; public PhaseController(int maxWorkers) { this.maxWorkers maxWorkers; this.workerSemaphore new Semaphore(maxWorkers); } public void startPhase(int phase) throws InterruptedException { phaseLock.lock(); try { while(phase ! currentPhase) { phaseCondition.await(); } workerSemaphore.acquire(maxWorkers); // 获取所有许可 } finally { phaseLock.unlock(); } } public void endPhase() { phaseLock.lock(); try { currentPhase; workerSemaphore.release(maxWorkers); // 释放所有许可 phaseCondition.signalAll(); } finally { phaseLock.unlock(); } } public void doWork(Runnable task) throws InterruptedException { workerSemaphore.acquire(); try { task.run(); } finally { workerSemaphore.release(); } } }典型工作流程主线程调用startPhase(0)进入第一阶段工作线程通过doWork()执行任务主线程调用endPhase()结束当前阶段主线程调用startPhase(1)进入下一阶段这种模式特别适用于需要严格阶段控制的批处理场景如ETL数据处理流水线。

相关文章:

Java多线程实战:ReentrantLock与信号量Semaphore的5个高频使用场景解析

Java多线程实战:ReentrantLock与信号量Semaphore的5个高频使用场景解析 在Java并发编程领域,ReentrantLock和Semaphore是两个至关重要的同步工具。它们虽然都属于JUC(java.util.concurrent)包中的并发控制机制,但设计理…...

工业机器人嵌入式系统建模与自动化工具项目三基于RAPID指令的故障排查与项目实施

目录 一、 项目背景与研发目标 1.1 项目研发背景 1.2 项目核心目标 二、 项目全周期进展 2.1 需求分析与环境搭建阶段(完成度100%) 2.2 核心模块编码开发阶段(完成度100%) 2.3 功能调试阶段(核心故障爆发…...

1220亿美元!OpenAI创下史上最大融资纪录;DeepSeek连续三天发生服务异常;Claude Code 51万行源码泄露 | 极客头条

「极客头条」—— 技术人员的新闻圈!CSDN 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:zhanghycsdn.net)整理 | 苏宓出品 | CSDN(ID&…...

OpCore-Simplify:一键自动化黑苹果配置,让复杂技术变得简单

OpCore-Simplify:一键自动化黑苹果配置,让复杂技术变得简单 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore-Simplify是…...

新手入门:零基础借助快马生成你的第一个openmaic网页版调用程序

今天想和大家分享一个特别适合新手入门的实践项目——如何借助InsCode(快马)平台快速生成你的第一个openmaic网页版调用程序。作为一个刚接触AI开发的新手,我最初看到各种API文档和代码示例时也是一头雾水,但通过这个可视化工具,居然半小时就…...

一个月突变!Linux内核大佬懵了:上个月还是“AI垃圾”,这个月AI Bug报告却突然靠谱?

整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)最近在做开源项目维护的开发者,可能会有一种奇怪的错觉:Bug 似乎报告变多了,而且变准了——更准确地说,是 AI 报的 Bug,突然开始“靠谱了”。…...

芯片缺货潮下的应对策略与国产替代方案

1. 芯片缺货潮下的行业现状最近我的一个产品项目中,原本采购价仅5元的ST品牌MCU(微控制器)价格飙升至70元,涨幅高达14倍。这个案例并非个例,而是当前全球半导体行业供应链危机的缩影。作为从业十余年的硬件工程师&…...

MCP3208 12位SPI ADC嵌入式驱动与硬件设计实战

1. MCP3208芯片深度解析:面向嵌入式系统的12位8通道SPI模数转换器工程实践1.1 芯片定位与核心价值MCP3208是Microchip公司推出的逐次逼近型(SAR)模数转换器,专为资源受限的嵌入式系统设计。其核心价值在于以极简硬件接口&#xff…...

AI命理工具实测:主流大模型八字紫微能力对比及避坑指南

1. AI命理新风向:当大模型碰撞传统术数 最近身边刮起了一阵“AI命理”的热潮:做开发的朋友电脑里存着排盘工具包,运营岗的同事午休时在研究紫微斗数星曜含义,就连开策划会的间隙,都有人拿着AI输出的六爻结果讨论项目走…...

GLM-4.1V-9B-Base实战教程:跨境电商A+页面图像卖点自动提炼

GLM-4.1V-9B-Base实战教程:跨境电商A页面图像卖点自动提炼 1. 为什么需要自动提炼图像卖点 跨境电商卖家每天需要处理大量商品图片,传统人工标注方式存在三个痛点: 效率低下:一个运营人员每天最多处理50-100张图片成本高昂&…...

Vivado Design Suite中BUFG优化策略与实战技巧

1. 理解BUFG的核心作用与设计痛点 在FPGA设计中,时钟信号就像人体神经系统中的电脉冲,需要快速、准确地传递到每个功能单元。BUFG(全局时钟缓冲器)就是Xilinx器件中专用的"信号放大器",它能将时钟信号分配到…...

seo sem公司如何制定营销策略

SEO SEM公司如何制定有效的营销策略 在当今数字化时代,SEO(搜索引擎优化)和SEM(搜索引擎营销)已经成为企业推广和品牌建立的关键组成部分。无论是中小企业还是大型跨国公司,它们都需要高效、精准的营销策略…...

League-Toolkit:颠覆式英雄联盟客户端增强工具的全攻略

League-Toolkit:颠覆式英雄联盟客户端增强工具的全攻略 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit是一款基于官…...

高效医学知识图谱构建方案:CMeKG工具自动化处理中文医学文本技术深度解析

高效医学知识图谱构建方案:CMeKG工具自动化处理中文医学文本技术深度解析 【免费下载链接】CMeKG_tools 项目地址: https://gitcode.com/gh_mirrors/cm/CMeKG_tools 在医疗信息化与人工智能深度融合的今天,中文医学知识图谱构建面临严峻的技术挑…...

C#编写CIP通讯源码——欧姆龙NX1P通讯DEMO

C#编写CIP通讯源码,欧姆龙NX1P通讯DEMO一、概述 本代码是基于C#语言开发的CIP(Common Industrial Protocol)通讯Demo程序,专门用于与欧姆龙NX1P2系列PLC进行工业通讯交互。程序采用.NET Framework 4.8框架开发,通过TCP…...

NVIDIA Profile Inspector完全掌握:从问题诊断到性能优化的效率提升指南

NVIDIA Profile Inspector完全掌握:从问题诊断到性能优化的效率提升指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 许多玩家和创作者拥有高性能NVIDIA显卡,却因配置不当无法…...

XML 指南

XML 指南 引言 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。自从1998年发布以来,XML因其灵活性和广泛的应用场景而成为数据交换的标准格式。本文旨在为您提供一个全面的XML指南,帮助您了解XML的基本概念、语法规则、应用场景以及相关的最佳实践。 XML的基本…...

LCC-HVDC系统中交流滤波器的选型实战:从理论到工程落地

LCC-HVDC系统中交流滤波器的选型实战:从理论到工程落地 在特高压直流输电工程中,交流滤波器如同电力系统的"净化器",其选型直接关系到电网谐波抑制效果与系统运行经济性。某800kV换流站曾因滤波器选型不当导致年度损耗增加1200万元…...

合肥艺星12周年超级盛典 以“独1无2”之名,立品质医美新坐标

2026年4月1日,合肥艺星12周年超级盛典正式启幕。十二年,不只是时间的沉淀,更是品牌在品质、技术、服务、标准、态度、团队、城市责任与星品矩阵八大维度上,构建完整“坐标系”的高光时刻。合肥艺星以“独1无2”之姿,向安徽乃至全国医美行业定义出一份关于“独一”的答卷。独1无…...

零基础新手指南:借助快马AI无需代码构建你的第一篇论文官网

作为一个完全没有编程基础的研究生,我曾经为了搭建个人论文展示网站头疼不已。直到发现了InsCode(快马)平台,整个过程变得异常简单。下面分享我的完整实践过程,希望能帮助到同样需要展示学术成果的朋友们。 明确网站需求结构 在开始前&#x…...

附链小程序测评:支持Word/PDF/PPT/EXCEL/压缩包上传,解决公众号文件嵌入难题

公众号运营中,文件分发存在明确痛点:推文无法直接嵌入附件,第三方链接常出现跳转繁琐、广告弹窗、文件过期等问题,增加运营成本且影响用户体验。附链小程序为微信生态原生工具,核心解决上述痛点,支持公众号…...

OpenClaw多模态聊天机器人:Qwen2.5-VL-7B实现图片问答与表情包生成

OpenClaw多模态聊天机器人:Qwen2.5-VL-7B实现图片问答与表情包生成 1. 为什么选择OpenClaw构建多模态聊天机器人 去年我在运营一个技术社群时,经常遇到群成员发截图提问的场景。传统聊天机器人要么只能处理文字,要么需要将图片上传到第三方…...

STM32智能剪枝机:嵌入式系统与传感器集成实践

1. 项目背景与需求分析作为一名从事嵌入式开发多年的工程师,我最近完成了一个基于STM32的智能绿化带剪枝机项目。这个项目的初衷源于我在城市公园散步时的观察:园艺工人手持笨重的剪枝工具,在烈日下长时间弯腰作业,不仅效率低下&a…...

阿里云 ECS 部署 SpringBoot 项目完整教程(无坑可直接照着做)

需要购买阿里云服务器、学习服务器搭建的朋友看这里 👇阿里云超值折扣购买通道 :https://t.aliyun.com/U/L7DIVq 超详细服务器搭建教程:手把手教你阿里云服务器的购买及环境搭建 无论是新手入门、个人建站还是企业部署,都能一站…...

新手入门指南:基于快马平台构建vmware17交互式安装教学应用

新手入门指南:基于快马平台构建VMware17交互式安装教学应用 作为一个刚接触虚拟化技术的新手,第一次安装VMware Workstation 17时可能会遇到不少困惑。从下载安装包到最终配置完成,整个过程涉及多个步骤,每个环节都可能出现各种问…...

终极免费指南:让macOS视频预览功能瞬间强大的秘密武器

终极免费指南:让macOS视频预览功能瞬间强大的秘密武器 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https://gitcod…...

html-to-docx:让HTML转Word不再头疼的开源解决方案

html-to-docx:让HTML转Word不再头疼的开源解决方案 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 在数字化办公的浪潮中,文档格式转换已成为企业和个人的日常需求。据行业调研…...

论文AIGC全红99%怎么救?2026实测Gemini去痕术:3组指令集联合3大工具,稳稳拉回10%安全线

视角重构,打破“平铺直叙”的机械感 AI生成的最大特征是“正确但平庸的上帝视角”。要ai降ai,第一步不是改词,而是强行植入一个具有批判性的“人类观察者”视角,迫使模型重组叙事逻辑。 核心原理:通过引入“辩证法”…...

fSpy完全上手指南:从基础到实战的零门槛教程

fSpy完全上手指南:从基础到实战的零门槛教程 【免费下载链接】fSpy A cross platform app for quick and easy still image camera matching 项目地址: https://gitcode.com/gh_mirrors/fs/fSpy 当你需要将一张普通的2D照片转换为精确的3D场景时,…...

TEMOS

TEMOS(Text-conditioned Motion Synthesis)是2022年提出的一个文本驱动动作生成模型,核心设计是:文本编码器 动作编码器 动作解码器输入文本描述 → 生成对应的3D动作序列训练时用 KL 散度损失让文本和动作的隐空间分布对齐&…...