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

【juc】读写锁ReentrantReadWriteLock

目录

        • 一、说明
        • 二、读读不互斥
          • 2.1 代码示例
          • 2.2 截图示例
        • 三、读写互斥
          • 3.1 代码示例
          • 3.2 截图示例
        • 四、写写互斥
          • 4.1 代码示例
          • 4.2 截图示例
        • 五、注意事项
          • 5.2.1 代码示例
          • 5.2.2 截图示例

一、说明

  • 1.当读操作远远高于写操作时,使用读写锁让读读可以并发,来提高性能
  • 2.类似于数据库中的select … from … lock in share mode
  • 3.提供一个数据容器类,内部分别使用读锁保护数据的read()方法,写锁保护数据的write()方法

二、读读不互斥

2.1 代码示例
package com.learning;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.ReentrantReadWriteLock;@Slf4j
public class ReadWriteLockLearning {private Object data;private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();private ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();private ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();public Object read(){log.debug("获取读锁");readLock.lock();try {log.debug("读取");try {Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}return data;}finally {log.debug("释放读锁");readLock.unlock();}}public void write(){log.debug("获取写锁");writeLock.lock();try{log.debug("写入");}finally {log.debug("释放写锁");writeLock.unlock();}}public static void main(String[] args) {ReadWriteLockLearning readWriteLockLearning = new ReadWriteLockLearning();new Thread(()->{readWriteLockLearning.read();}, "t1").start();new Thread(()->{readWriteLockLearning.read();}, "t2").start();}
}
2.2 截图示例

在这里插入图片描述

三、读写互斥

3.1 代码示例
package com.learning;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.ReentrantReadWriteLock;@Slf4j
public class ReadWriteLockLearning {private Object data;private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();private ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();private ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();public Object read(){log.debug("获取读锁");readLock.lock();try {log.debug("读取");return data;}finally {log.debug("释放读锁");readLock.unlock();}}public void write(){log.debug("获取写锁");writeLock.lock();try{log.debug("写入");try {Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}}finally {log.debug("释放写锁");writeLock.unlock();}}public static void main(String[] args) {ReadWriteLockLearning readWriteLockLearning = new ReadWriteLockLearning();new Thread(()->{readWriteLockLearning.read();}, "t1").start();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}new Thread(()->{readWriteLockLearning.write();}, "t2").start();}
}
3.2 截图示例

在这里插入图片描述

四、写写互斥

4.1 代码示例
package com.learning;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.ReentrantReadWriteLock;@Slf4j
public class ReadWriteLockLearning {private Object data;private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();private ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();private ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();public Object read(){log.debug("获取读锁");readLock.lock();try {log.debug("读取");return data;}finally {log.debug("释放读锁");readLock.unlock();}}public void write(){log.debug("获取写锁");writeLock.lock();try{log.debug("写入");try {Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}}finally {log.debug("释放写锁");writeLock.unlock();}}public static void main(String[] args) {ReadWriteLockLearning readWriteLockLearning = new ReadWriteLockLearning();new Thread(()->{readWriteLockLearning.write();}, "t1").start();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}new Thread(()->{readWriteLockLearning.write();}, "t2").start();}
}
4.2 截图示例

在这里插入图片描述

五、注意事项

  • 1.读锁不支持条件变量
  • 2.不支持重入时升级:持有读锁的情况下去获取写锁,会导致获取写锁永久等待
5.2.1 代码示例
package com.learning;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.ReentrantReadWriteLock;@Slf4j
public class ReadWriteLockLearning2 {private Object data;private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();private ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();private ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();public void readWrite(){log.debug("获取读锁");readLock.lock();try {try{log.debug("获取写锁");writeLock.lock();}finally {log.debug("释放写锁");writeLock.unlock();}}finally {log.debug("释放读锁");readLock.unlock();}}public static void main(String[] args) {ReadWriteLockLearning2 readWriteLockLearning = new ReadWriteLockLearning2();readWriteLockLearning.readWrite();}
}
5.2.2 截图示例

在这里插入图片描述

  • 3.支持重入时降级:持有写锁的情况下去获取读锁

相关文章:

【juc】读写锁ReentrantReadWriteLock

目录 一、说明二、读读不互斥2.1 代码示例2.2 截图示例 三、读写互斥3.1 代码示例3.2 截图示例 四、写写互斥4.1 代码示例4.2 截图示例 五、注意事项5.2.1 代码示例5.2.2 截图示例 一、说明 1.当读操作远远高于写操作时,使用读写锁让读读可以并发,来提高…...

Linux开机启动Tomcat

需求背景 Linux重启后要手动执行"startup.sh"启动Tomcat&#xff0c;比较麻烦&#xff0c;想要Linux开机启动Tomcat。 开机启动 #---------------------------------------------------------- sudo tee /usr/bin/tomcat.sh <<-EOF #! /bin/bash nohup /opt/to…...

javaweb、spring、springmvc和springboot有什么区别,都是做什么用的?

JavaWeb是一种基于Java技术的Web开发模式&#xff0c;用于构建动态的、可交互的Web应用程序。它是一种使用Java语言开发Web应用的技术堆栈&#xff0c;包括Java Servlet、JavaServer Pages&#xff08;JSP&#xff09;、JavaServer Faces&#xff08;JSF&#xff09;等。JavaWe…...

已解决module ‘pip‘ has no attribute ‘pep425tags‘报错问题(如何正确查看pip版本、支持、32位、64位方法汇总)

本文摘要&#xff1a;本文已解决module ‘pip‘ has no attribute ‘pep425tags‘的相关报错问题&#xff0c;并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。并且最后说明了如何正确查看pip版本、支持、32位、64位方法汇总 &#x1f60e; 作者介绍&…...

Matlab(画图初阶)

目录 1.plot()函数 2. hold(添加新绘图是否保留旧绘图) 3. Plot Style 3.1 线型 3.2 标记 3.3 颜色 ​编辑 4. legend() 5.X 、Y and Title&#xff1f; 6. Text()和annotation() 7.line(创建基本线条) 7.1 基本语法 7.2 指定线条属性 7.3 更改线条属性 8.图像属性 8.1 …...

汽车自适应巡航系统控制策略研究

目 录 第一章 绪论 .............................................................................................................................. 1 1.1 研究背景及意义 ..........................................................................................…...

C语言面试题值反转字符串

知识捡漏本 1.C语言优先级 &#xff1a;左高于高于 右 2.定义宏函数product&#xff0c;调用product后&#xff0c;里面的i和i都是加两次1&#xff0c;i就是两个加2后的i相乘&#xff0c;i是开始的i和1后的i相乘。 3.用i (j4,k 8,m 16);这种定义方法&#xff0c;最终i和最后一…...

【大数据】Apache Iceberg 概述和源代码的构建

Apache Iceberg 概述和源代码的构建 1.数据湖的解决方案 - Iceberg1.1 Iceberg 是什么1.2 Iceberg 的 Table Format 介绍1.3 Iceberg 的核心思想1.4 Iceberg 的元数据管理1.5 Iceberg 的重要特性1.5.1 丰富的计算引擎1.5.2 灵活的文件组织形式1.5.3 优化数据入湖流程1.5.4 增量…...

对分库分表进行批量操作

对ShardingJDBC基础了解&#xff1a;https://blog.csdn.net/m0_63297646/article/details/131894472 对批量操作案例&#xff1a;https://blog.csdn.net/m0_63297646/article/details/131843517 分为db0和db1两个库&#xff0c;每个库都有三张订单表&#xff0c;分表键根据年份…...

大数据组件-Flume集群环境的启动与验证

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…...

【包过滤防火墙——iptables静态防火墙】的简单使用

文章目录 规则链的分类--五链处理的动作iptables常用参数和作用 防火墙就是堵和通的作用 iptables &#xff1a;包过滤防火墙&#xff0c;是内核防火墙netfilter的管理工具 核心&#xff1a;四表五链 规则链的分类–五链 在进行路由选择前处理的数据包&#xff1a;PREROUTIN…...

关于MySQL数据库版本不同导致表进行比较的时候报错illegal mix of collations...的问题

问题发生的原委 之前在项目开发的时候&#xff0c;我本地也建立了数据库用作开发库&#xff0c;我本地的数据库版本是5.7的&#xff0c;但是测试和生产库都是8.0的版本&#xff0c;我们定义的数据库字符集是utf8mb4&#xff0c;排序规则是utf8mb4_general_ci&#xff0c;前段时…...

进程、操作系统

文章目录 一、冯诺依曼体系&#xff08;Von Neumann Architecture&#xff09;1. 概述2. CPU 二、操作系统&#xff08;Operating System&#xff09;三、进程(process)/任务(task) 一、冯诺依曼体系&#xff08;Von Neumann Architecture&#xff09; 1. 概述 分类 CPU 中央处…...

hadoop学习:mapreduce入门案例四:partitioner 和 combiner

先简单介绍一下partitioner 和 combiner Partitioner类 用于在Map端对key进行分区 默认使用的是HashPartitioner 获取key的哈希值使用key的哈希值对Reduce任务数求模决定每条记录应该送到哪个Reducer处理自定义Partitioner 继承抽象类Partitioner&#xff0c;重写getPartiti…...

HTTP与SOCKS5的区别对比

在互联网世界中&#xff0c;服务器是一种重要的工具&#xff0c;可以帮助我们提高网络安全性等。今天&#xff0c;我们将重点关注两种常见的技术&#xff1a;HTTP和SOCKS5。让我们深入了解它们的工作原理、用途和优缺点&#xff0c;并通过Python代码示例学习如何使用它们。 HT…...

在阿里云请求发短信接口去掉证书验证

composer require alibabacloud/dysmsapi-20170525 2.0.23 cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://dysmsapi.aliyuncs.com/?PhoneNumbers 两种方法 第一…...

k8s里pv pvc configmap

通过storageClassName 将PV 和PVC 关联起来。 [rootk8-master home]# cat /home/npm-pvc.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata:name: npm-repository-pvcnamespace: jenkins spec:accessModes:- ReadWriteManyresources:requests:storage: 50GistorageC…...

【Atcoder】 [ARC144D] AND OR Equation

题目链接 Atcoder方向 Luogu方向 题目解法 考虑满足条件 2 2 2 的形式为 a n p 0 ∑ i ∈ n p i a_np_0\sum\limits_{i\in n}p_i an​p0​i∈n∑​pi​ 这是一步很巧妙的转化&#xff0c;神奇地利用了 & \& & 和 ∣ | ∣ 的性质&#xff0c;把求 a a a 的…...

python使用字典暴力解析wifi密码

前言 最近无wifi可用,搜到了很多高质量但是没有密码的WiFi,我在想应该可以用python调用常见的wifi字典包来暴力破解一下这些WiFi,也许可以成功 原理 使用pip install pywifi命令安装pywifi 使用它调用本机网卡,设置wifi加密方式,对字典包扫描密码逐个尝试 扫描失败的密码会被…...

java八股文面试[多线程]——synchronized锁升级详细流程

偏向锁 偏向锁是JDK6中的重要引进&#xff0c;因为HotSpot作者经过研究实践发现&#xff0c;在大多数情况下&#xff0c;锁不仅不存在多线程竞争&#xff0c;而且总是由同一线程多次获得&#xff0c;为了让线程获得锁的代价更低&#xff0c;引进了偏向锁。 偏向锁是在单线程执…...

远程工作事故树:一次误删库引发的跨国追责

远程协作下的“脆弱”系统深夜&#xff0c;伦敦办公室的数据库工程师在连续工作十二小时后&#xff0c;敲下了一条他以为指向“测试环境”的删除命令。与此同时&#xff0c;上海的测试团队正在为次日的上线进行最后一轮回归验证。六小时后&#xff0c;当阳光照进浦东的办公室&a…...

论文答辩智能化:10款AI辅助工具推荐(附爱毕业aibiye使用技巧)

工具对比速览表 工具名称 核心功能 适用场景 特色优势 Aibiye 智能成文、文献查找、数据分析 社科/金融/理工类论文 融合多模型架构&#xff0c;精准把握高校规范 Aicheck 初稿生成、大纲定制、图表插入 快速完成初稿需求 全学科覆盖&#xff0c;20-30分钟极速生成 …...

AgentCPM-Report轻量化部署:Pixel Epic智识终端GPU显存优化方案

AgentCPM-Report轻量化部署&#xff1a;Pixel Epic智识终端GPU显存优化方案 1. 项目背景与核心价值 Pixel Epic智识终端是一款基于AgentCPM-Report大模型构建的创新研究辅助工具。它将枯燥的科研报告撰写过程转化为一场像素风格的RPG冒险&#xff0c;让用户在游戏化的交互体验…...

科哥二次开发AWPortrait-Z体验:批量生成人像,效率提升300%

科哥二次开发AWPortrait-Z体验&#xff1a;批量生成人像&#xff0c;效率提升300% 1. 为什么选择AWPortrait-Z进行人像生成&#xff1f; 在当今内容创作领域&#xff0c;高质量人像需求呈现爆发式增长。从电商产品展示到社交媒体内容&#xff0c;专业级人像已经成为刚需。然而…...

OpenClaw自动化周报生成:Qwen2.5-VL-7B图文混合排版实战

OpenClaw自动化周报生成&#xff1a;Qwen2.5-VL-7B图文混合排版实战 1. 为什么需要自动化周报 每周五下午3点&#xff0c;我的日历总会准时弹出"写周报"的提醒。作为一个小团队的Tech Lead&#xff0c;我需要汇总Jira任务进展、Git代码提交、会议纪要等零散信息&am…...

MMS50MV ToF传感器SPI驱动开发与嵌入式应用

1. MMS50MV ToF传感器驱动深度解析1.1 器件背景与系统定位MMS50MV是由日本Sunhayato株式会社&#xff08;サンハヤト&#xff09;专为Sony Spresense开发平台设计的飞行时间&#xff08;Time-of-Flight, ToF&#xff09;传感器扩展板。该模块并非通用型ToF芯片&#xff0c;而是…...

Vibe Coding氛围编程系列:AI 模型 服务选择之哪个模型编程能力最强?

前言 2026年&#xff0c;AI辅助编程早已告别了“单行代码补全”的初级阶段&#xff0c;正式进入了Vibe Coding&#xff08;氛围编程&#xff09; 的全新时代。所谓氛围编程&#xff0c;核心是AI能完全贴合开发者的编码思路、节奏与工作流&#xff0c;实现无断点、沉浸式的流畅…...

LangChain实战:如何用ConversationalRetrievalQA构建带记忆的智能问答系统(附完整代码)

LangChain实战&#xff1a;构建带记忆的智能问答系统全流程解析 在当今AI应用开发领域&#xff0c;对话系统的"记忆力"已成为衡量其智能水平的关键指标。想象一下&#xff0c;当用户第三次询问"刚才提到的方案有哪些优势"时&#xff0c;如果AI回答"您…...

Matlab vs Python:灰色关联分析(GRA)可视化效果大比拼

Matlab vs Python&#xff1a;灰色关联分析可视化效果与实现深度对比 在数据科学领域&#xff0c;灰色关联分析(Grey Relational Analysis, GRA)作为一种强大的小样本数据分析工具&#xff0c;正逐渐受到研究者和实践者的青睐。面对两种主流编程语言Matlab和Python&#xff0c;…...

DMA固件读卡器源码:pcileech-带读卡器仿真的FPGA

DMA固件读卡器源码&#xff0c;只提供源码 pcileech-带读卡器仿真的fpga最近在折腾硬件安全研究的小伙伴们应该都听说过DMA&#xff08;直接内存访问&#xff09;读卡器的骚操作。这玩意儿不经过CPU直接跟内存对话的特性&#xff0c;在取证和漏洞挖掘领域简直是个神器。今天咱们…...