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

Java并发编程:ReentrantReadWriteLock读写锁

前言在Java并发编程中锁机制是保证线程安全的重要手段。synchronized和ReentrantLock都是排他锁同一时刻只允许一个线程访问共享资源。但在实际业务场景中读操作往往远多于写操作如果多个读线程之间也要互相等待会严重影响系统性能。ReentrantReadWriteLock读写锁正是为了解决这个问题而设计的。它维护了一对锁读锁和写锁通过读写分离的策略大幅提升并发性能。一、读写锁的核心特性锁类型特性说明读锁共享锁多个线程可同时持有读锁写锁排他锁同一时刻只能有一个线程持有写锁读写锁遵循以下基本原则读-读共享多个读线程可以同时执行写-写互斥多个写线程不能同时执行读-写互斥读操作和写操作不能同时进行二、三种场景代码实战2.1 读读共享读锁是共享锁多个线程可以同时获取读锁互不阻塞。public class ReadReadTest { public static void main(String[] args) { MyTask myTask new MyTask(); new Thread(() - myTask.read(), t1).start(); new Thread(() - myTask.read(), t2).start(); } static class MyTask { private final ReentrantReadWriteLock lock new ReentrantReadWriteLock(); public void read() { try { lock.readLock().lock(); System.out.println(Thread.currentThread().getName() start); Thread.sleep(10000); System.out.println(Thread.currentThread().getName() end); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.readLock().unlock(); } } } }运行结果t1 start t2 start t1 end t2 end可以看到t1和t2几乎同时开始读锁不互斥。2.2 写写互斥写锁是排他锁同一时刻只能有一个线程持有写锁。public class WriteWriteTest { public static void main(String[] args) { MyTask myTask new MyTask(); new Thread(() - myTask.write(), t1).start(); new Thread(() - myTask.write(), t2).start(); } static class MyTask { private final ReentrantReadWriteLock lock new ReentrantReadWriteLock(); public void write() { try { lock.writeLock().lock(); System.out.println(Thread.currentThread().getName() start); Thread.sleep(10000); System.out.println(Thread.currentThread().getName() end); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.writeLock().unlock(); } } } }运行结果t1 start t1 end t2 start t2 endt2必须等待t1释放写锁后才能执行写锁互斥。2.3 读写互斥读写操作互斥读操作进行时写操作必须等待反之亦然。public class ReadWriteTest { public static void main(String[] args) { MyTask myTask new MyTask(); Thread t1 new Thread(() - myTask.read(), t1); Thread t2 new Thread(() - myTask.write(), t2); t1.start(); // 确保t1先获取读锁 Thread.sleep(2000); t2.start(); } static class MyTask { private final ReentrantReadWriteLock lock new ReentrantReadWriteLock(); public void read() { try { lock.readLock().lock(); System.out.println(Thread.currentThread().getName() start); Thread.sleep(10000); System.out.println(Thread.currentThread().getName() end); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.readLock().unlock(); } } public void write() { try { lock.writeLock().lock(); System.out.println(Thread.currentThread().getName() start); Thread.sleep(10000); System.out.println(Thread.currentThread().getName() end); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.writeLock().unlock(); } } } }运行结果t1 start t1 end t2 start t2 endt2必须等待t1读完才能开始写读写互斥。三、读写锁的适用场景读写锁特别适合读多写少的业务场景场景是否适用原因缓存系统✅ 非常适合大量读操作偶尔更新配置中心✅ 非常适合配置读取频繁变更极少计数器❌ 不适合读写比例接近1:1账户转账❌ 不适合写操作频繁锁竞争严重四、注意事项4.1 锁降级ReentrantReadWriteLock支持锁降级写锁可以降级为读锁但读锁不能升级为写锁。// 锁降级允许 writeLock.lock(); readLock.lock(); // 写锁持有状态下获取读锁 writeLock.unlock(); // 仍然持有读锁 // 锁升级不允许会死锁 readLock.lock(); writeLock.lock(); // 线程永久阻塞5.2 公平性选择与ReentrantLock一样读写锁也支持公平/非公平模式非公平模式默认吞吐量更高但可能造成写线程饥饿公平模式线程按请求顺序获取锁避免饥饿// 公平读写锁 ReentrantReadWriteLock fairLock new ReentrantReadWriteLock(true);5.3 重入特性读写锁支持锁重入但需要注意读线程可以重复获取读锁写线程可以重复获取写锁也可以获取读锁锁降级六、总结对比项ReentrantLockReentrantReadWriteLock锁类型排他锁读写分离读并发不并发并发写并发不并发不并发适用场景读写均衡读多写少最佳实践在读操作远多于写操作的场景下优先考虑使用ReentrantReadWriteLock它可以显著提升系统吞吐量让并发性能得到质的飞跃。

相关文章:

Java并发编程:ReentrantReadWriteLock读写锁

前言在Java并发编程中,锁机制是保证线程安全的重要手段。synchronized和ReentrantLock都是排他锁,同一时刻只允许一个线程访问共享资源。但在实际业务场景中,读操作往往远多于写操作,如果多个读线程之间也要互相等待,会…...

Windows电脑安装安卓应用终极指南:APK安装器完整教程

Windows电脑安装安卓应用终极指南:APK安装器完整教程 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上直接运行安卓应用&#x…...

Windows 10/11 上从零搞定 OpenCDA 自动驾驶仿真环境:CARLA 0.9.14 + PyTorch + SUMO 保姆级配置流程

Windows 10/11 上从零搞定 OpenCDA 自动驾驶仿真环境:CARLA 0.9.14 PyTorch SUMO 保姆级配置流程自动驾驶仿真技术正在成为行业研究和开发的重要工具。对于刚接触这一领域的开发者来说,搭建一个完整的仿真环境往往是第一个挑战。本文将带你一步步在Win…...

终极跨平台游戏资源管理器:VPKEdit完全指南

终极跨平台游戏资源管理器:VPKEdit完全指南 【免费下载链接】VPKEdit A CLI/GUI tool to create, read, and write several pack file formats. 项目地址: https://gitcode.com/gh_mirrors/vp/VPKEdit 你是否曾经为处理Source引擎游戏资源而烦恼?…...

CleanMyWechat:你的微信磁盘空间救星,三步告别几十GB的缓存困扰

CleanMyWechat:你的微信磁盘空间救星,三步告别几十GB的缓存困扰 【免费下载链接】CleanMyWechat 自动删除 PC 端微信缓存数据,包括从所有聊天中自动下载的大量文件、视频、图片等数据内容,解放你的空间。 项目地址: https://git…...

桌面实时股票监控终极指南:5分钟打造你的Windows投资助手

桌面实时股票监控终极指南:5分钟打造你的Windows投资助手 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins 在当今快节奏的数字时代,投资者们常常需要在工作…...

Taotoken 的 API Key 分级管理与审计日志功能在安全合规中的实际价值

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken 的 API Key 分级管理与审计日志功能在安全合规中的实际价值 在企业级应用开发中,将大模型能力集成到业务系统…...

3分钟快速上手:终极免费音乐解锁工具,让加密音频重获自由

3分钟快速上手:终极免费音乐解锁工具,让加密音频重获自由 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项…...

可视化 React 水合(Hydration)问题

以下是 Next.js React 水合(Hydration)问题的 Mermaid 可视化,包含流程图(问题全景)和时序图(时间线视角),以及简要说明。1. 水合问题全景流程图 #mermaid-svg-tjAQ0VWDBl1ii9LA{fo…...

开源入门踩坑实录:新手必避的10个坑,每个都让我熬到凌晨三点

开源入门踩坑实录:新手必避的10个坑,每个都让我熬到凌晨三点“如果有人能在我入坑开源的第一周告诉我这些,我能少走三个月的弯路。”这是我作为一个普通开发者,从"连GitHub是什么都不知道"到成功给知名开源项目提交PR的…...

next.js 开发中的水合(Hydration)问题

Next.js 16.2 React 19 完全规避水合问题开发规范完整指南 一、水合问题的根本原因 水合错误(Hydration Mismatch)发生的唯一根本原因是:服务端渲染生成的 HTML 与客户端首次渲染生成的虚拟 DOM 结构不一致。 React 19 对水合错误的检测更加…...

天际模组编排师:用LOOT主列表告别游戏崩溃的智能解决方案

天际模组编排师:用LOOT主列表告别游戏崩溃的智能解决方案 【免费下载链接】skyrimse The TES V: Skyrim Special Edition masterlist. 项目地址: https://gitcode.com/gh_mirrors/sk/skyrimse 你是否曾因《上古卷轴V:天际 特别版》模组冲突而烦恼…...

Warcraft Helper终极指南:8大功能让魔兽争霸3在现代系统重获新生

Warcraft Helper终极指南:8大功能让魔兽争霸3在现代系统重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在Window…...

火狐浏览器配置Burp Suite抓包完全指南

1. 为什么火狐浏览器在Burp Suite里“抓不到包”?——不是工具不行,是链路断了很多人第一次用Burp Suite配火狐时,点开Proxy → Intercept is on,浏览器照常访问网站,但Burp的HTTP History里空空如也。刷新十次、重启三…...

Burp Suite小白挖洞实战:公益漏洞挖掘的最小可行闭环

1. 这不是“无脑”,而是把重复动作压缩成肌肉记忆“使用Burp Suite插件如何无脑挖的第一个公益漏洞(小白挖洞)”——这个标题里最危险的词,不是“Burp Suite”,也不是“公益漏洞”,而是“无脑”。我带过二十…...

长期使用Taotoken Token Plan套餐在项目开发中的成本节省体感

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken Token Plan套餐在项目开发中的成本节省体感 1. 项目背景与成本挑战 我们团队负责一个中型AI应用项目的开发&…...

App爬虫实战:突破SSL Pinning、动态签名与设备指纹的五层反爬

1. 这不是写个 requests 就能跑通的“爬虫”,而是一场持续数月的攻防拉锯战“App 父亲”这个词在移动互联网圈里没人真叫,但所有做过 App 数据采集的人心里都清楚——你面对的从来不是一串 API 接口,而是一个被精心加固、层层设防、会主动识别…...

百度网盘直链解析:5分钟实现全速下载的终极指南

百度网盘直链解析:5分钟实现全速下载的终极指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的非会员限速而烦恼吗?每次下载大文件都…...

对比直接使用厂商API,Taotoken在稳定性方面的补充价值

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接使用厂商API,Taotoken在稳定性方面的补充价值 在构建依赖大模型能力的应用时,开发者通常会直接调用…...

VSCode中R语言开发环境配置与使用完整教程

VSCode中R语言开发环境配置与使用完整教程 【免费下载链接】vscode-R R Extension for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-R 在数据科学和统计分析工作中,R语言开发者常常面临开发环境碎片化的问题:代码编辑…...

LSLib:游戏资源逆向工程的架构级解决方案

LSLib:游戏资源逆向工程的架构级解决方案 【免费下载链接】lslib Tools for manipulating Divinity Original Sin and Baldurs Gate 3 files 项目地址: https://gitcode.com/gh_mirrors/ls/lslib 面对《神界:原罪》和《博德之门3》等CRPG游戏复杂…...

如何永久解锁Cursor Pro功能:面向开发者的完整解决方案

如何永久解锁Cursor Pro功能:面向开发者的完整解决方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tr…...

如何用本地图像搜索工具实现千万级图片秒级检索:隐私优先的终极解决方案

如何用本地图像搜索工具实现千万级图片秒级检索:隐私优先的终极解决方案 【免费下载链接】ImageSearch 基于.NET10的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 你是否曾经在…...

【Gemini代码生成能力权威评测】:基于2000+真实编码场景的7大维度深度拆解

更多请点击: https://codechina.net 第一章:Gemini代码生成能力评测总览 Google Gemini 系列模型(尤其是 Gemini 1.5 Pro)在多模态理解与代码生成任务中展现出显著的上下文建模能力。本章聚焦其在真实编程场景中的代码生成质量、…...

仅剩最后47套!《ChatGPT脑筋急转弯生成军规手册》PDF+127个经A/B测试验证的高互动Prompt模板(含儿童/职场/银发三版适配)

更多请点击: https://kaifayun.com 第一章:ChatGPT脑筋急转弯生成的核心价值与认知重构 传统脑筋急转弯创作依赖人类经验直觉,存在耗时长、多样性受限、语义陷阱设计不精准等瓶颈。而基于大语言模型的自动化生成,不仅突破了创意密…...

Zotero文献去重插件:高效清理重复文献的完整解决方案

Zotero文献去重插件:高效清理重复文献的完整解决方案 【免费下载链接】ZoteroDuplicatesMerger A zotero plugin to automatically merge duplicate items 项目地址: https://gitcode.com/gh_mirrors/zo/ZoteroDuplicatesMerger 在学术研究过程中&#xff0c…...

范式依附与认知殖民:中国AI的文明主权危机及贾子破局之路

范式依附与认知殖民:中国AI的文明主权危机及贾子破局之路摘要:当前中国AI产业以Benchmark跑分缩小、性能指标逼近美国的表层繁荣,掩盖了深层的范式依附与认知殖民危机。本文指出,中美AI的核心差距并非算力、参数与榜单数据&#x…...

长期使用Taotoken的账单追溯与成本分析实践分享

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken的账单追溯与成本分析实践分享 在将大模型能力集成到产品或研发流程中时,成本的可观测性与可控性是团…...

【限时开放】Gemini CSR活动策划黄金模板包(含GDPR+AI Act双合规checklist、多语言志愿者管理看板、ESG叙事脚本生成器)

更多请点击: https://intelliparadigm.com 第一章:Gemini CSR活动策划黄金模板包概览 Gemini CSR活动策划黄金模板包是一套面向企业社会责任(CSR)项目全生命周期管理的结构化工具集,专为科技型企业、公益组织及ESG战略…...

Real-ESRGAN-GUI完整教程:如何免费使用AI图像增强工具实现高清修复

Real-ESRGAN-GUI完整教程:如何免费使用AI图像增强工具实现高清修复 【免费下载链接】Real-ESRGAN-GUI Lovely Real-ESRGAN / Real-CUGAN GUI Wrapper 项目地址: https://gitcode.com/gh_mirrors/re/Real-ESRGAN-GUI 你是否曾为模糊的老照片、低分辨率的网络图…...