ReadWriteLock读写锁

Java读写锁 ReadWriteLock 维护一对关联的locks,一个用于只读操作,一个用于写操作。read lock可以由多个阅读器同时进行,只要没有作者write lock是独家的。基本意思可分为如下几种场景写锁不存在、多次加读锁成功写锁存在、加读锁失败、加写锁失败读锁不存在、单次加写锁成功、多次加写锁只有第一个写锁能成功读锁存在、加读锁成功、加写锁失败复制代码。 阅读详情

读写锁,分场景优化,提升性能。

读写锁遵守的基本原则:
  1. 允许多个线程同时读共享变量。
  2. 只允许一个线程写共享变量。
  3. 如果一个写线程正在执行写操作,此时禁止多线程读共享变量。
  4. 读锁与写锁是互斥的;写锁与写锁也是互斥的。

读写锁适用于读多写少的场景。

读写锁与互斥锁的区别:读写锁运行多个线程同时读共享变量。

ReadWriteLock 是一个接口,ReentrantReadWriteLock可重入读写锁是他的实现类。

读写锁实例:

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @Description:
 * @Author: LYQ
 * @Date: 2019/9/10 11:12
 * @Version: V1.0
 **/
public class Cache<K,V> {
    final Map<K,V> m = new HashMap<>();
    final ReadWriteLock rwl = new ReentrantReadWriteLock();
    //读锁
    final Lock r =  rwl.readLock();
    //写锁
    final Lock w = rwl.writeLock();

    /**
     * 读缓存
     * @param key
     * @return
     */
    V get(K key){
        //获取读锁
        r.lock();
        try {
            return  m.get(key);
        }finally {
            r.unlock();
        }
    }

    /**
     * 写缓存
     * @param key
     * @param value
     * @return
     */
    V put(K key,V value){
         w.lock();
         try{
             return m.put(key,value);
         }finally {
             w.unlock();
         }
    }

}
锁的升级与降级

锁升级:读锁->写锁; 先获取读锁,然后升级为写锁。

锁降级:写锁->读锁;先获取写锁,人后升级为读锁。

ReadWriteLock支持锁的降级,不支持升级。

由读锁变写锁需要先把读锁释放掉再获取写锁,由写锁变读锁无需释放写锁。

【AI+教育】别再让 Cursor 只当编辑器了!4 步解锁 Claude 官方技能! 本文介绍了在Windows环境下通过OpenSkills工具在Cursor中调用Claude AI技能的方法。主要内容包括:1)安装Node.js环境;2)全局安装OpenSkills工具;3)安装Claude官方技能库;4)通过AGENTS.md文件同步技能;5)在Cursor中直接调用技能完成Excel、PPT等任务。文章提供了详细的操作步骤和示例,帮助用户快速上手使用AI技能提升工作效率。 阅读详情

相关推荐

实战指南:用Python实现ONVIF WS-Discovery设备发现(附完整代码)

本文提供了一份详细的实战指南,介绍如何使用Python实现基于ONVIF标准的WS-Discovery设备发现协议。文章深入解析了协议原理、网络通信模型,并提供了完整的代码实现,帮助开发者快速构建智能安防和物联网应用中的设备自动发现工具,有效提升网络设备集成与管理的效率。

chair的专栏 1113

读写锁

为什么读写要互斥,读的时候不能写,写的时候不能读? 举个例子,用户A正在读的时候,用户B对数据进行了写操作,就会出现A读到的数据不准确。A在写的时候,B去读,则读到的数据也是不准确的。所以读和写要互斥。读写锁的特点1、读锁与写锁互斥。 2、读锁之间不互斥。 3、写锁与写锁互斥。读写锁分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这些特性由jvm底层控制,代码中加上相应的锁即可。使用的时候注意

iktz.cn的博客 1108

模拟IC设计避坑:手把手教你用Cadence仿真恒定跨导轨到轨运放(附完整工艺库文件)

本文详细解析了使用Cadence仿真恒定跨导轨到轨运放的全流程,涵盖电路原理、工艺库配置、尺寸设计及仿真分析。通过1:3电流镜补偿技术实现跨导稳定,提供CSMC 0.25um工艺下的实战案例,帮助工程师规避设计陷阱,提升模拟IC设计效率。

weixin_30952535的博客 494

ReentrantReadWriteLock读写锁(读多写少场景)

ReentrantReadWriteLock读写锁 适合读多写少的场景。 读锁ReentrantReadWriteLock.ReadLock可以被多个线程同时持有, 所以并发能力很高。 写锁ReentrantReadWriteLock.WriteLock是独占锁, 在一个线程持有写锁时候, 其他线程都不能在抢占, 包含抢占读锁都会阻塞。 读写锁的互斥原则如下: 读操作与读操作, 线程之间是可以共存的, 是相容的。 读操作与写操作、 线程之间不能共存的, 是互斥的、 当有写锁操作时候, 其

志豪的博客 1272

深入博通PEX89000内部:那颗ARM CPU和Synthetic Mode到底能玩出什么花样?

本文深入解析博通PEX89000系列PCIe交换芯片内置的ARM CPU与Synthetic Mode技术,揭示其在AI计算和数据中心的智能潜能。通过ARM Cortex CPU的实时控制和Synthetic Mode的自治网络功能,PEX89000实现了GPU集群的动态拓扑重组和资源池化,大幅提升AI训练效率。文章还探讨了该技术在软件定义数据平面和弹性AI架构中的创新应用。

weixin_30776273的博客 210

Wireshark抓包实战:5个CTF比赛中高频出现的流量分析技巧(附真实案例)

本文分享了Wireshark在CTF比赛和实战渗透中的五个核心流量分析技巧。内容涵盖从宏观统计概览锁定可疑目标、深度解析ICMP与HTTP等协议、追踪重组完整会话流,到利用字符串搜索和命令行工具进行自动化分析。掌握这些高阶技巧能显著提升分析海量网络流量的效率与精准度。

rrr55的博客 261

C++如何使用读写锁(read-write lock)来优化读多写少的并发场景?

读写锁是一种特殊的锁机制,旨在解决在共享资源访问中读操作远多于写操作的场景下,传统锁机制带来的性能瓶颈。它的核心思想是区分读操作和写操作,并对这两种操作施加不同的访问规则。具体而言,读写锁允许多个线程同时获取读锁(Read Lock)来访问共享资源,从而实现读操作的并行化;而对于写操作,则要求线程获取写锁(Write Lock),并确保在写锁被持有时,其他任何线程(无论是读线程还是写线程)都无法访问资源。这种“读共享,写独占”的设计,正是读写锁区别于其他同步机制的关键所在。

大模型大数据攻城狮的专栏 1343

C语言专升本编程题

湖南省专升本选拔考试,C语言程序设计内部习题

weixin_45729947的博客 2116

11.读多写少场景的ReadWriteLock和更优秀的StampedLock

前面我们介绍了管程和信号量这两个同步原语在Java语言中的实现,理论上用这两个同步原语中任何一个都可以解决所有的并发问题。那Java SDK并发包里为什么还有很多其他的工具类呢?原因很简单:分场景优化性能,提升易用性。 今天我们就介绍一种非常普遍的并发场景:读多写少场景。实际工作中,为了优化性能,我们经常会使用缓存,例如缓存元数据、缓存基础数据等,这就是一种典型的读多写少应用场景。缓存之所以能提升性能,一个重要的条件就是缓存的数据一定是读多写少的,例如元数据和基础数据基本上不会发生变化(写少),但是使用它

lss446937072的博客 866

子网划分详解

还不会子网划分?看这篇就够了,保姆级教程

m0_47584619的博客 6093

K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

🔴 K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2万+

深入理解读写锁—ReadWriteLock源码分析

ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。 所有读写锁的实现必须确保写操作对读操作的内存影响。换句话说,一个获得了读锁的线程必须能看到前一个释放的写锁所更新的内容。 读写锁比互斥锁允许对于共享数据更大程度的并发。每次只能有一个写线程,但是同时可以有多个线程并发地读数据。ReadWriteLock适用于读多写少的并发

xingfeng_coder的博客 7万+

AgentScope 实战训练营-A2UI的完整实现:从概念到部署全流程

本文详细介绍了如何在AgentScope框架中实现Google的A2UI(Agent-to-Agent UI)协议,构建一个能生成可交互UI的智能体应用。文章涵盖了从环境准备、架构设计、核心代码实现到测试部署的完整流程,包括A2UI协议解析、技能系统、客户端实现、通信机制等核心技术点,适合AI Agent和前端开发人员学习参考。

program哲学 201

读写锁ReadWriteLock

读写锁ReadWriteLock 读写锁是什么? ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader线程同时保持。写入锁是独占的。ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。对于读取操作占 多数的数据结构。 ReadWriteLock 能提供比独占锁更高的...

qq_19903753的博客 206

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ReadWriteLock 读写锁

ReadWriteLock 读写锁 读-写锁ReadWriteLock 1.ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有writer,读取锁可以由多个reader 线程同时保持。写入锁是独占的。。 2.ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。Rea...

HYL512的专栏 351

怀旧版电脑GBC模拟器

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

Java读写锁ReadWriteLock

一、读写锁ReadWriteLock ReadWriteLock 是 JDK 中的读写锁接口,提供了 readLock 和 writeLock 两种锁的操作机制,一个是读锁,一个是写锁。 ReadWriteLock同Lock一样也是一个接口,ReentrantLock 是Lock的一种实现,ReentrantReadWriteLock 是 ReadWriteLock 的一种实现。 ReadWriteLock 中只有写锁支持Condition,读锁不支持,读锁调用 newCondition() 方法,会

Charge8的博客 1326

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

关于ReadWriteLock读写锁的介绍

通过合理选择锁策略,可以在高并发场景下平衡性能与公平性! 普通锁是排他锁(Exclusive Lock):无论读还是写,同一时刻只能有一个线程持有锁,性能较低。ReadWriteLock基于 AQS:通过 state 字段的高位和低位分别管理读锁和写锁。读锁与读锁不互斥。读锁与写锁互斥。写锁与写锁互斥。

weixin_50055999的博客 1757

java并发编程系列之ReadWriteLock读写锁的使用

前面我们讲解了Lock的使用,下面我们来讲解一下ReadWriteLock锁的使用,顾明思义,读写锁在读的时候,上读锁,在写的时候,上写锁,这样就很巧妙的解决synchronized的一个性能问题:读与读之间互斥。 ReadWriteLock也是一个接口,原型如下: public interface ReadWriteLock { Lock readLock(); Lock w

牛奋lch 1万+

基于ReadWriteLock读写锁实现的缓存

package william.pattern; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadW...

weixin_34452850的博客 428

09 读写锁 ReadWriteLock

读写锁 ReadWriteLock ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持,而写入锁是独占的。 ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。 ReadWriteLock 能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。 示例: import java.u

朱古力的博客 142

ReadWriteLock:读写锁

ReadWriteLock是Java并发编程中的读写分离锁机制,通过维护一对锁(共享读锁和排他写锁)实现高效并发访问。其核心设计遵循"读共享、写排他"原则,在读取操作频繁而写入操作稀少的场景下显著提升性能(如缓存系统、配置管理)。ReentrantReadWriteLock作为主要实现,支持可重入性、锁降级和公平/非公平模式,但需注意避免写锁饥饿和读锁升级问题。该锁特别适用于读多写少的高并发场景,相比传统排他锁可大幅提高系统吞吐量。

weixin_43076660的博客 728

深入理解读写锁 ReadWriteLock

是Java包中定义的一个接口,它维护了一对相关的锁:一个用于读操作的锁(ReadLock)和一个用于写操作的锁(WriteLock读锁(ReadLock):是共享锁。在没有写锁被持有的情况下,多个线程可以同时获取读锁。这意味着,只要没有线程正在修改数据,任意数量的线程都可以并发地读取数据,从而显著提高并发性能。写锁(WriteLock):是排他锁。只有当没有任何读锁或写锁被持有时,写锁才能被一个线程获取。一旦写锁被持有,所有后续的读锁和写锁请求都将被阻塞,直到写锁被释放。

weixin_56018532的博客 1025
上一篇: java中的线程&创建线程的三种方式
下一篇: Java线程池ThreadPoolExecutor
刘彦青-Yannis
博客等级 码龄10年 1万+粉丝 234原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

刘彦青-Yannis

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

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

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

打赏作者

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

抵扣说明:

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

余额充值