读写锁

读写锁ReentrantReadWriteLock详解 读写锁、ReentrantReadWriteLock 阅读详情

读写锁

相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些。假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(译者注:也就是说:读-读能共存,读-写不能共存,写-写不能共存)。这就需要一个读/写锁来解决这个问题。Java5在java.util.concurrent包中已经包含了读写锁。尽管如此,我们还是应该了解其实现背后的原理。

 读 写 这种的 可以用wait  notify 之前已经实现过了  读的时候不能写 写的时候不能做 保证共性的全局变量安全

下面,先来写个读写锁大家看看:

package com.toov5.readAndWriteLock;

import java.util.HashMap;
import java.util.Map;

//读写锁 类似jvm内置缓存(把值存到jvm中)
public class writeAndReadLock {
    private volatile Map<Object,Object> cache = new HashMap<>();  
    
    //写入元素
    public void put(String key,String value){
        try {
            Thread.sleep(500);
            System.out.println("写入"+key+value);
            cache.put(key, value);
            System.out.println("写入"+key+value+"结束");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    //读取元素
    public String get(String key){
        try {
            Thread.sleep(500);
            System.out.println("读取"+key);
            String result = cache.get(key).toString();
            System.out.println("读取"+key+"结束");
            return result;
        } catch (Exception e) {
            return null;
        }
    }
    
     public static void main(String[] args) {
        writeAndReadLock lock = new writeAndReadLock();
        //写线程
          Thread t1 = new Thread(new Runnable() {    
            @Override
            public void run() {
                for(int i =0; i<10;i++){
                    lock.put("i", i+"");
                }
            }
        });
          
      //读线程      
          Thread t2 = new Thread(new Runnable() {
                
                @Override
                public void run() {
                    for(int i=0; i<10;i++){
                        lock.get(i+"");
                    }
                }
            }); 
      t1.start();
      t2.start();
          
    }
    
}

结果:

 

如果两个方法都加上synchronize 那么读的时候 不能写 写的时候不能读

下面提供读写锁:

package com.toov5.readAndWriteLock;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;

//读写锁 类似jvm内置缓存(把值存到jvm中)
public class writeAndReadLock {
    private volatile Map<Object,Object> cache = new HashMap<>();  
    private ReentrantReadWriteLock wrl = new ReentrantReadWriteLock();  
    private WriteLock wirtelock=wrl.writeLock();//获取到写锁
    private ReadLock readLock =wrl.readLock(); //获取到读锁
    //写入元素
    public void put(String key,String value){
        try {    
            wirtelock.lock();
            Thread.sleep(500);
            System.out.println("写入"+key+value);
            cache.put(key, value);
            System.out.println("写入"+key+value+"结束");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            wirtelock.unlock();
        }
    }
    
    //读取元素
    public String get(String key){
        try {
            readLock.lock();
            Thread.sleep(500);
            System.out.println("读取"+key);
            String result = cache.get(key).toString();
            System.out.println("读取"+key+"结束");
            return result;
        } catch (Exception e) {
            return null;
        }finally{
            readLock.unlock();
        }
    }
    
     public static void main(String[] args) {
        writeAndReadLock lock = new writeAndReadLock();
        //写线程
          Thread t1 = new Thread(new Runnable() {    
            @Override
            public void run() {
                for(int i =0; i<10;i++){
                    lock.put("i", i+"");
                }
            }
        });
          
      //读线程      
          Thread t2 = new Thread(new Runnable() {
                
                @Override
                public void run() {
                    for(int i=0; i<10;i++){
                        lock.get(i+"");
                    }
                }
            }); 
      t1.start();
      t2.start();
          
    }
    
}

没有写完时候 是不能读的

看源码:

与之前的lock锁不一样之前是 reentrantlock,它有读和写两把锁

 两个线程同时写,同时读是不可能的。不共存! 

读读 可以 读写不可共存  写写不可以共存

 

 

Pthread实现读写锁 Pthread实现读写锁 1. 博客内容: 编写Pthread程序,使用两个条件变量和一个互斥量来实现一个读写锁。比较当读优先级更高时和写优先级更高时程序的性能。并进行归纳总结。 2. 实现思路: 2.1 读写锁: 读写锁是一种特殊的锁,它把对资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。 一次只有一个线程可以占有写模式... 阅读详情

相关推荐

QSPI Flash的原理与QSPI时序的Verilog实现

本节主要是讨论QSPI(Quad SPI,四线SPI总线)的相关内容。我的开发板上有一片型号是W25Q128BV的Quad SPI Flash存储器,本文将以它为例子来说明QSPI操作的一些内容。

Go Forward Forever! 4166

读写锁及其实现

适用场景 少量写+大量的读 注意这个是先是读优先的 读写锁的三种状态 1.读模式下的加锁 2.写模式下的加锁 3.不加锁 加锁规则 写的情况: 1.一次只有一个线程可以占用写模式的读写锁 2.一个执行流在写的时候,其他执行流既不能写,也不能读,只能陷入阻塞状态 3.多个读取线程可以同时占用读模式下的读写锁,在读写锁的内部有一个引用计数器 引用计数:标识着有多少以读模式打开的读写锁线程 1.每当一个线程以读模式打开读写锁的时候,引用计数器+1 2.当一个线程释放以读模式打开读写锁的时候,引用计数器-1 作用:

weixin_45425093的博客 2657

医疗AI Agent实战:从零搭建一个能看病的智能助手(附完整代码)

本文详细介绍了如何从零搭建一个医疗AI Agent智能助手,涵盖核心架构设计、症状推理引擎开发、安全与合规实现以及系统集成等关键环节。通过完整的代码示例和实战案例,帮助开发者快速构建具备医疗咨询能力的智能Agent,提升医疗服务的效率和质量。

ss78901的博客 467

读写锁与进程守护

 一、读写锁:一种交易场所:变量、数组、链表等其他数据结构两种角色:读者、写者三种关系:读者和写者之间没有关系;写者与写者之间互斥;读者与写者之间同步和互斥关系读者与读者之间共享,读者与写者之间必须等一方解锁,另一方才能加锁;读者与写者线程同时竞争锁,写者会优先获取到锁1.案例:代码:# include&lt;stdio.h&gt;# include&lt;stdlib.h&gt;# includ...

xuruhua的博客 439

Sparse4Dv3

instance_feature也设置为nn.Parameter。修正分支2*(linear->relu->linear->relu->layernorm)->linear->scale,分类分枝2*(linear->relu->layernorm)->linear(256,9),质量评估分枝2*(linear->relu->layernorm)->linear(256,2)。每组两类instance,1是加上范围(-x,x)内均匀分布噪声,2是加上(-2x,-x)U(x,2x)范围内均匀分布噪声。

yuanl15的博客 1351

深入解析SPLL单相软件锁相环:从SOGI原理到PI系数调优实践

本文深入解析SPLL单相软件锁相环技术,从SOGI原理到PI系数调优实践,详细介绍了其在数字电源设计中的应用。通过数学推导和实际调试经验,帮助工程师快速掌握锁相环的核心参数计算和优化方法,提升电网相位追踪的精确度和响应速度。

weixin_30316097的博客 382

C++读写锁以及实现方式

适用场景:需要理解底层原理,或在不支持C++20的环境中模拟读写锁。POSIX读写锁:适用于UNIX系统的高性能场景,但需手动管理锁生命周期。C++20共享互斥锁:跨平台、安全、简洁,推荐现代C++项目使用。自定义实现:帮助理解底层原理,但需谨慎处理线程安全和性能问题。合理使用读写锁能显著优化读多写少场景的并发性,但需注意避免死锁和饥饿问题,结合具体业务场景选择最优方案。参考资料。

w148_1748的博客 2038

vue2/3 - 详细实现高德地图轨迹回放,vue高德地图车辆历史行驶轨迹播放,在地图上绘制行程轨迹|起点和终端的路程绘制|用户运动轨迹绘制及播放等(支持开始/暂停、进度条拖放、控制播放轨迹的倍速等)

vue2,vue3,nuxt,高德地图,轨迹,vue高德地图轨迹回放,历史轨迹回放,轨迹回放功能支持倍速及进度条拖拽,VUE高德地图轨迹回放、倍速调整、进度条拖拽,vue3高德地图轨迹回放,Vue实现地图路径回放,vue中使用高德地图实现历史轨迹回放并能控制播放轨迹的倍速,多条轨迹陆续播放,巡航轨迹做带进度条和倍速的轨迹回放,Vue高德地图路径回放,历史轨迹回放并能控制播放轨迹的倍速,使用高德地图实现轨迹播放和进度条控制,vue高德地图如何实现轨迹回放,高德地图做轨迹绘制用什么api,高德轨迹API,驾车轨

✅ 精选推荐文章 1万+

Redisson读写锁

读写锁 一次只有一个线程可以占有写模式的读写锁, 但是可以有多个线程同时占有读模式的读写锁. 正是因为这个特性, 当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞. 当读写锁在读加锁状态时, 所有试图以读模式对它进行加锁的线程都可以得到访问权, 但是如果线程希望以写模式对此锁进行加锁, 它必须直到所有的线程释放锁. 通常, 当读写锁处于读模式锁住状态时, 如果有另外线程试图以写模式加锁, 读写锁通常会阻塞随后的读模式锁请求, 这样可以避免读模式锁长期占用, 而等待的写模式

qq_43750656的博客 7022

性能优化-高通cDSP(QDSP6)架构详解

高通cDSP开发的商业价值30秒快速认识高通cDSP开发的商业价值【高通cDSP旨在处理一些简单但需要大量计算的场景,如图像处理、科学计算、AI训练、计算机视觉等。这些场景使用CPU来运算会极大的降低CPU的吞吐量,因此利用现代寄存器较宽的特性设计出了适配数据并行的DSP芯片,cDSP就是典型的代表。利用cDSP+CPU既可以满足一般的使用场景,也可以完成现代图像和视频数据的处理。

发狂的小花的博客 5945

4-都2026年了,嵌入式发展前景怎么样,还适合入行吗?

本文系统分析了嵌入式行业的发展前景,指出到2026年嵌入式将迎来由"万物智联"驱动的黄金周期。文章回顾了嵌入式技术的四个演进阶段,从专用计算机到AIoT时代,强调其技术积累的延续性。作者从人才流向、产业智能化转型、高校新增专业等角度论证嵌入式行业的蓬勃发展,并提出"铁三角"模型分析其驱动力和护城河。最后给出职业发展路径建议,认为嵌入式适合长期主义者,在智能汽车、边缘计算等领域有广阔前景。文章建议读者抓住产业升级机遇,选择这一稳定且有复利效应的技术赛道。

指尖动听知识库 389

C++读写锁介绍

一点睛 先看看互斥锁,它只有两个状态,要么是加锁状态,要么是不加锁状态。假如现在一个线程a只是想读一个共享变量 i,因为不确定是否会有线程去写它,所以我们还是要对它进行加锁。但是这时又有一个线程b试图去读共享变量 i,发现被锁定了,那么b不得不等到a释放了锁后才能获得锁并读取 i 的值,但是两个读取操作即使是同时发生的,也并不会像写操作那样造成竞争,因为它们不修改变量的值。所以我们期望在多个线...

实践求真知 1万+

YOLO26涨点改进 | 全网独家创新!注意力改进篇 | CVPR 2025 | 引入RALA秩增强线性注意力模块,含多种创新改进,助力YOLO26适合目标检测、图像分割、图像分类有效涨点

🔥本文给大家介绍使用RALA模块改进YOLO26可以显著提升其性能,尤其在复杂场景和小物体检测中。通过增强线性注意力机制的矩阵秩,RALA改善了模型对空间信息的建模能力,提升了特征的多样性和全局信息的融合,进而提高了检测精度。同时,RALA保持了线性复杂度,避免了Softmax注意力的高计算成本,使YOLO26在实时检测任务中既能保持高效计算,又能提高检测精度,尤其是在小物体和遮挡物体的检测中表现突出。🔥欢迎订阅我的专栏、带你学习使用最新-最前沿-独家YOLO26创新改进!

Ai缝合怪、助力小伙伴高效发论文 143

Linux读写锁详解

多线程程序中,如果仅有少数线程会对共享数据进行修改,多数线程只是读取共享数据的值,就适合用读写锁解决“线程间抢夺资源”的问题。当有多个线程发出读请求时,这些线程可以同时执行,也就是说,共享数据的值可以同时被多个发出读请求的线程获取;当有多个线程发出写请求时,这些线程只能一个一个地执行(同步执行)。此外,当发出读请求的线程正在执行时,发出写请求的线程必须等待前者执行完后才能开始执行;当发出写请求的线程正在执行时,发出读请求的线程也必须等待前者执行完后才能开始执行。

m0_74282605的博客 1173

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

linux读写锁

3) 读写不能同时进行,写的优先级高:例如,线程A加读锁成功,又来了B线程加写锁阻塞,又来了C线程加读锁阻塞。4)线程 A 加读锁成功,然后线程 B 请求写锁,然后线程 C 请求读锁 :B 写阻塞,C 读阻塞;5)线程 A 加读写成功,然后线程 B 请求读锁,然后线程 C 请求写锁 :B 读阻塞,C 写阻塞;2)写独占-串行处理:例如,线程 A 加写锁成功,有来个 3 个线程,作读操作,3 个线程阻塞。1)读共享-并行处理:例如,线程 A 加读锁成功,有来个 3 个线程,作读操作,也可加锁成功。

m0_57678852的博客 2584

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

读写锁及死锁

一、读写锁有些公共数据修改的机会很少,但其读的机会很多。并且在读的过程中会伴随着查找,给这种代码加锁会降低我们的程序效率。读写锁可以解决这个问题。读写锁本质上是一种自旋锁读者——写者:同步与互斥写者——写者:互斥读者——读者:共享、没关系面试题:为什么消费者与消费者之间是互斥而读者与读者之间是没关系?因为消费者会将数据拿走,而读者只访问不会将数据拿走注意:写独占,读共享,写锁优先级高       ...

zhuboke3344的博客 4519

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Windows平台下的读写锁

Windows平台下的读写锁 简单介绍Windows平台下的读写锁以及实现. 背景介绍 Windows在Vista 和 Server2008以后才开始提供读写锁API,即SRW系列函数(InitializeSRWLock, AcquireSRWLockShared, AcquireSRWLockExclusive等).考虑到目前Windows XP的装机量,只能自己实现一个读写锁了.

Que's C++ Studio 1万+

c++读写锁的实现

读写锁的实现 读写锁的实现1、使用互斥锁和条件变量实现读写锁2、使用2个互斥锁实现读写锁3、用mutex和conditon实现写优先的读写锁参考 读写锁的实现 1、使用互斥锁和条件变量实现读写锁 class readwrite_lock { public: readwrite_lock() : stat(0) { } void readLock() { mtx.lock(); while (stat < 0) cond.wait(mtx); ++stat; mt

JMW1407的博客 2180

C语言pthread读写锁

Pthread是 POSIX threads 的简称,是POSIX的线程标准。pthread读写锁把对共享资源的访问者分为读者和写者,读者只对共享资源进行读访问,写者只对共享资源进行写操作。在互斥机制,读者和写者都需要独立独占互斥量以独占共享资源,在读写锁机制下,允许同时有多个读者读访问共享资源,只有写者才需要独占资源。相比互斥机制,读写机制由于允许多个读者同时读访问共享资源,进一步提高了多线程的并发度。 1.读写锁机制: 写者:写者使用写锁,如果当前没有读者,也没有其他写者,写者立即获得写锁;否...

jinking01的专栏 4251

读写锁的原理与实现

对于生产者和消费者模型的概念图👇那么我们读写锁源自读者写着模型,和生产者和消费者模型十分类似👇两个的模型实际上是一模一样的,我们还是通过“三二一”来深入了解一下读者写者模型三种关系读者-读者:没有关系,共享公共资源读者-写者:互斥、同步,因为读的时候发生了写或写的时候来读,读取到的信息都是错误的!!写者-写者:互斥,临界资源中当有一个写者时其他所有人(不论你是读者还是写者)都进不来两者角色:写者和读者一个场所:临界区生产者和写者两个是一模样的,都是向临界区输入数据的读者和消费者。

潜心钻研技术 1808

Linux 读写锁

读写锁是互斥锁的升级版,如果加了读锁,多个线程作读操作,那么读是并发的或者并行的,所以可以提高读操作的时候程序的执行效率。但是在写操作的时候,和互斥锁一样,还是串行的。读写锁在 Linux 中类型为锁定状态:锁定 / 打开锁定的是什么操作:读操作/写操作哪个线程上的锁读写锁的使用方式和互斥锁的使用方式一样:找共享资源,确定临界区,在临界区的开始位置加锁(读锁 / 写锁),临界区结束的位置解锁。

fufufu_的博客 1096
上一篇: Java锁机制-重入锁
下一篇: 乐观锁和悲观锁
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值