JAVA多线程设计模式篇 7、Read-Write Lock 模式——霸气侧漏的写,唯唯诺诺的读

Java多线程编程之读写锁ReadWriteLock用法实例 主要介绍了Java多线程编程之读写锁ReadWriteLock用法实例,本文直接给出编码实例,需要的朋友可以参考下 立即下载


Read-Write Lock Pattern将读取与写入分开处理,在读取数据之前必须获取用来读取的锁定,而写入的时候必须获取用来写入的锁定。因为读取时实例的状态不会改变,所以多个线程可以同时读取;但是,写入会改变实例的状态,所以当有一个线程写入的时候,其它线程既不能读取与不能写入。
即读取与写入冲突 和 写入与写入冲突。

因为读取的线程之间没有冲突。因此多个Reader角色可以参与读取,提升程序性能。

1.示例

1.1 参与角色

Read-Write Lock模式的角色如下:

  • Reader(读取者)参与者
    Reader参与者会对SharedResource进行读。
  • Writer(写入者)参与者
    Writer参与者会对SharedResource进行写。
  • SharedResource(共享资源)参与者
    SharedResource代表Reader和Writer所共享的资源对象,SharedResource提供不改变内部状态的read操作,以及会改变内部状态的write操作。
  • ReadWriteLock(读写锁)参与者
    ReadWriteLock提供了对SharedResource参与者进行read操作和write操作时需要的锁定。

2 示例代码

2.1 字段说明

核心是这个实例。这个实例中定义了4个数量

  • int readingReaders = 0; // 实际正在读取的线程数量
  • int waitingWriters = 0; // 正在等待写入的线程数量
  • int writingWriters = 0; // 实际正在写入的线程数量
  • boolean preferWriter = true; // 写入优先的话,值为true

2.2 方法说明

  • readLock()方法
    只要preferWriter 为true,且有等待写的线程,读线程会wait。只要正在写,也会wait
  • readUnlock()方法
    每次readUnlock()后 就会将 preferWriter设置为true。
  • writeLock()方法
    只要有读线程、写线程在运行,就等待。
  • writeUnlock()方法
    将 preferWriter设置为False。

2.3 值得反复多读几次的代码


public final class ReadWriteLock {
    private int readingReaders = 0; // 实际正在读取的线程数量
    private int waitingWriters = 0; // 正在等待写入的线程数量
    private int writingWriters = 0; // (C)...实际正在写入的线程数量
    private boolean preferWriter = true; // 写入优先的话,值为true

    public synchronized void readLock() throws InterruptedException {
        while (writingWriters > 0 || (preferWriter && waitingWriters > 0)) {
            wait();
        }
        readingReaders++;                       //  (A)实际正在读取的线程数量加1
    }

    public synchronized void readUnlock() {
        readingReaders--;                       //  (A)实际正在读取的线程数量减1
        preferWriter = true;  //read处理后优先处理write
        notifyAll();
    }

    public synchronized void writeLock() throws InterruptedException {
        waitingWriters++;                       // (B)正在等待写入的线程数量加1
        try {
            while (readingReaders > 0 || writingWriters > 0) {
                wait();
            }
        } finally {
          waitingWriters--;                   // (B)正在等待写入的线程数量减1
        }
        writingWriters++;                       //  (C)实际正在写入的线程数量加1
    }

    public synchronized void writeUnlock() {
        writingWriters--;                       // (C)实际正在写入的线程数量减
        preferWriter = false;  //write处理后优先处理read
        notifyAll();
    }
}

总结

Read-Write Lock 模式适用于读取频率比写入频率高的场景。
Read-Write Lock Pattern将读取与写入分开处理,在读取数据之前必须获取用来读取的锁定,而写入的时候必须获取用来写入的锁定。因为读取时实例的状态不会改变,所以多个线程可以同时读取;但是,写入会改变实例的状态,所以当有一个线程写入的时候,其它线程既不能读取与不能写入。

多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。

https://github.com/forestnlp/concurrentlab

如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。

您的支持是对我最大的鼓励。

KEGG数据库与KAAS工具:基因功能注释的实用指南 本文提供了使用KEGG数据库与KAAS工具进行基因功能注释的完整实用指南。详细阐述了如何从准备基因或蛋白序列开始,通过KAAS服务器获取KEGG Orthology(KO)编号,并解读注释结果。文章进一步介绍了如何利用KOBAS工具进行通路富集分析,将定性观察转化为定量洞察,并分享了提高注释准确率、处理大数据集及使用API等避坑技巧与高阶方法,为基因组学、转录组学研究者奠定坚实的数据分析基础。 阅读详情

相关推荐

为什么类型论是函数式编程的理想基础?

函数式编程(如Haskell、Scala、OCaml)以“函数为核心”“无副作用”“不可变数据”等特性著称,但它的“安全高效”并非凭空而来——背后的关键支撑是类型论。本文将聚焦“类型论如何支撑函数式编程”,从基础概念到具体案例,解释两者的本质联系。本文将按“故事引入→核心概念解释→关系拆解→原理+代码案例→实际应用→总结”的逻辑展开,用“乐高积木”“菜谱”等比喻贯穿全文,确保抽象理论可视化。类型论:程序的“接口规则手册”,定义类型和函数的约束;函数式编程。

AI天才研究院 694

多线程基础之设计模式Read-Write-Lock模式

多线程基础之设计模式Read-Write-Lock模式

m0_51681531的博客 470

fastjson1.2.83反序列化漏洞

【代码】fastjson1.2.83反序列化漏洞。

Coder的博客 1万+

膜拜!国际程序设计师,用图、文、码就解剖了Java多线程设计模式

提起多线程编程,恐怕许多开发人员都会摇头表示不懂。确实,在校生和刚就职的开发人员往往很少有机会能够实践多线程编程。多数情况下,他们都是在开发框架下编写单线程的业务代码,而多线程的部分则被封装在了框架内部。即使是经验丰富的开发人员也会感叹他们曾经在多线程上栽过的跟头。但不可否认的是,多线程的确是一把利器,活用多线程有助于提高程序的响应性和吞吐量。可以毫不夸张地说,多线程是开发人员在继续“升级”的过程中必须打倒的一只“怪物”。

老男孩的架构路 543

用友U8接口开发全攻略:从EAI到OpenAPI的5种方式详解(附避坑指南)

本文深度解析了用友U8系统接口开发的五种核心方式:EAI、API、OpenAPI、SQL直连与内部CO组件。文章详细对比了各方式的适用场景、优缺点及实战操作,并提供了清晰的选型决策框架与避坑指南,帮助开发者根据具体业务需求选择最高效、最稳定的集成路径。

weixin_29322855的博客 685

电磁波成像技术全解析:从γ射线到无线电波的应用实践

本文全面解析电磁波成像技术,从γ射线到无线电波的应用实践。详细介绍了不同波长电磁波的特性与实用场景,包括医疗影像、工业检测、安防监控等领域。特别探讨了X射线、红外热成像、毫米波雷达等前沿技术的实战应用,为读者提供技术选型指南和操作技巧。

weixin_29305337的博客 293

java多线程设计模式之Read-Write Lock模式

当线程“读取”实例的状态时,实例的状态不会发生变换,实例的状态尽在执行线程的时候“写入”操作时才会发生变化,是实例的状态来看,起有着本质的区别。在将要说的设计模式中,读取和写入是相互分开的,在进行相应的操作之前必须获取其对应的锁。所以多个线程可以同时读取,但是当在写入的时候不允许读取操作,一般来说,执行互斥处理会降低程序的性能,但是如果吧针对写入的互斥处理和针对读取的互斥处理分开来考虑,则可以提高

Cherish__it的博客 408

海康视觉脚本开发全流程解析

本文详细解析了海康机器视觉平台(VM)中脚本模块的开发全流程。从创建第一个脚本模块入手,深入讲解了输入参数、输出参数与内部变量的定义与区别,并提供了C#脚本编写、公用函数调用、代码结构组织以及编译调试的实用指南。旨在帮助开发者掌握海康视觉脚本开发的核心技巧,高效实现复杂的自定义视觉逻辑处理。

beer8的博客 602

Java多线程相关知识【12】--设计模式--读写锁模式(读写模式)

文章目录Java多线程相关知识【11】--设计模式--读写锁模式(读写模式)1.问题的引入产生问题的代码2.解决方案解决的原理代码实现读写锁的实现3.进阶解决方案问题的引入解决的原理代码实现读写锁共享数据读线程写线程读写锁的缺陷缺陷的分析缺陷的解决解决的实现代码读写锁改进 Java多线程相关知识【11】–设计模式–读写锁模式(读写模式) 1.问题的引入 ​ 假设现在有一个景点,而这个景点也只...

努力的小白X 395

Cesium中实现GPU计算的泥石流地形侵蚀

通过模拟分析,可以提前识别可能发生泥石流的区域,为防灾减灾提供依据,及时发布预警,避免或减少人员伤亡和财产损失。:在建设公路、桥梁、水库等基础设施时,通过泥石流模拟分析,可以预测泥石流可能对这些设施的影响,帮助工程设计者采取合适的防护措施,确保设施的安全性。:模拟分析有助于为灾后救援工作提供科学依据,确定受灾区域的范围、救援难度等,为救援队伍制定合理的行动方案,提升救援效率。:泥石流是山区常见的地质灾害之一,通过模拟分析可以评估某一地区发生泥石流的风险,指导土地使用规划、人口迁移等决策。

weixin_43481439的博客 1320

微信小程序 - 解决web-view嵌套H5网页白屏问题,将h5网页嵌套在webview页面出现无法加载一片空白,详解微信小程序<web-view>页面跳转出现白屏情况(无论本地还是线上H5都能解决)

微信小程序解决web-view打开网页在手机上出现白屏的问题,小程序web-view嵌套H5项目白屏问题分析及解决,使用web-view组件加载H5网页链接后白屏情况,小程序嵌套的h5网页中跳转页面时也有可能出现白屏问题,嵌套webview页面时,出现白屏,WebView 加载不出网页,微信小程序<web-view>页面跳转出现白屏解决方法,解决WebView白屏空白,H5内嵌第三方小程序打开白屏,微信小程序嵌入h5页面加载空白,微信小程序web-view跳转h5白屏,解决微信小程序web-view打开网页

🏆 前端领域优质创作者 1万+

读写锁ReadWriteLock

在jdk帮助文档中是这么说的:A ReadWriteLock维护一对关联的locks,一个用于只读操作,一个用于写操作。read lock可以由多个阅读器同时进行,只要没有作者 write lock 是独家的 意思就是读操作可以被多个线程同时读,写操作只能由一个线程去写 ReadWriteLock同Lock一样也是一个接口,提供了readLock和writeLock两种锁的操作机制,一个是只读的锁,一个是写锁。ReentranReadWriteLock是其...

欢迎一起学习交流 2291

对CryptoDriver里密钥格式定义的探索(1)

一入网络安全才发现深似海,传统汽车MCU码农转型之路异常艰难。在CP AUTOSAR中的CryptoDriver SWS对密钥格式的需求来源于RFC,其中要求了RSA、ECC、SHE等key material的格式。再往下看,我就有些迷糊了,例如关于RSA Private Key的OCTEE STRING格式根据IETF RFC8017,Public Key又得根据RFC5280,完全不得其解。所以今天先从生成密钥对,并对其进行解析开始,一步一步拆解。

认真搞搞汽车MCU 527

多线程read-write lock模式

设想教师里 老师在黑板上写字 同学在下面读 读+读 无需等待 读+写 写等待读释放锁 写+读 读等待写释放锁 写+写 后来的等待 总结: 读都是共享的 只要有写 就有互斥等待 谁是后来的 谁就等待 该模式需要四个类 共享资源类 读类 对比互斥独占,读时也只能一个一个线程读。该模式读锁可以共享数据资源 不用一个一个读 但是却因为逻辑过重未必比互斥独占来的快 写类 读写锁类 该模式的读写锁 是程序员自己编写的一套逻辑锁(比如JUC) 对JAVA基层的物理锁进行封装 看似是两个锁 其实是两个逻辑锁在共用

ss123mlk的博客 237

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OV9734 DATASHEET,完整规格书

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

Read-Write Lock模式

java多线程设计模式全部源码: java多线程设计模式源码 模式图 一般类图 下面例子的类图 项目架构图 Main.java public class Main { public static void main(String[] args) { Data data = new Data(10); new

u010919133的专栏 407

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

六、Read-Write Lock 模式

ShareResource角色提供了read和write操作。read操作不会改变ShareResource角色的状态,而write操作则会改变其状态。 执行read和Reader角色和执行write的Writer角色是明确分开的,当read比write执行频繁时,Reader角色和Writer角色之间无需同等地执行互斥处理, 这是因为Reader角色之间无需执行互斥处理。 但是,完全不执行互斥处理很危险。这是因为,当Reader角色正在read时,Writer角色必须等待,而当Writ...

donkeyboy001的博客 286

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java多线程模式之Read-Write Lock 模式

6. Read-Write Lock模式大家一起读没问题,但读的时候不要写哦 在Read-Write Lock模式中,读取操作和写入操作是分开考虑的,在执行读取操作之前,线程必须获取用于读取的锁,而在执行写入操作之前,线程必须获取用于写入的锁。由于当线程执行读取操作时,实例的状态不会发生变化,所以多个线程可以同时读取,但在读取的时候,不可以写入。当线程执行写入操作时,实例的状态就会发生变化。因此,...

qq_31350373的博客 562

[多线程]Read-Write Lock模式

学生们正在一起看老师在黑板上写的板书,这时,老师想擦掉板书,再写新的内容.而学生们说道:"老师,我们还没看完,don't wipe it!"于是,老师会等待大家看完.在线程"读取"实例的状态时,实例的状态不会发生变化.实例的状态仅在线程"写入"时才会发生变化.ReadWriteLock类:public class ReadWriteLock { private int readingReader...

for justice 332

轻松学习多线程-07-Read Write Lock 模式

目录 目录 Read Write Lock 模式 实际案例 定义 测试 实现方式 UML & Code UML Code 系列导航 Read Write Lock 模式 Read Write Lock 模式就是将内容的读取和写入分开进行处理。 因为数据的互斥需要牺牲性能,读的时候可以互不影响,但是读的时候禁止写。 实际案例 类信息概览: ...

4万+

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 289

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 346

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 198

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 130

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 501

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 635
上一篇: JAVA多线程设计模式篇 6、Producer-Consumer 模式——你生产我消费
下一篇: JAVA多线程设计模式篇 8、Thread-Per-Message 模式——来,这就是你的任务
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

悟空学编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值