对读写锁的深入理解-读写锁技术的妙用---实现缓存

深入解析Windows读写锁机制及其实现 读写锁是一种允许多个读操作并行执行的锁,但在写操作执行时,它会阻止其他读或写操作。这种锁特别适用于读多写少的场景,比如在缓存或者数据库索引中。在C语言中,通过一个结构体来表示,并提供了一组函数来操作这个结构体。上述代码展示了如何定义并初始化一个对象。函数用于初始化临界区对象,使得之后可以安全地使用临界区进行同步。读写锁(Read-Write Lock)允许在没有写操作的情况下允许多个读操作并发执行,但当一个写操作正在进行时,任何其他的读或写操作都必须等待。 阅读详情

对读写锁的深入理解


 参考:http://www.educity.cn/wenda/380140.html  其中有些小理解错误,大体可以接受

        参考:http://www.wang1314.com/doc/topic-898895-1.html  主要通过其理解降级锁


1、对降级锁的理解

2、读写锁技术的妙用----读写锁实现缓存


1、锁降级

       锁降级是指写锁降级为读锁。如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种分段完成的过程不叫锁降级。锁降级是指把持住(当前拥有)写锁,再获取到读锁,然后释放(先前拥有的)写锁的过程。锁降级中读锁的获取是否有必要呢?答案是必要的。主要是为了保证数据的可见性,如果当前线程不获取读锁而是直接释放写锁,假设此刻另一个线程T获取了写锁了并修改了数据,那么当前线程无法感知到线程T的数据更新。如果当前线程获取读锁,即遵循锁降级的步骤,则线程T将会被阻塞,直到当前线程使用数据并释放读锁之后,线程T才能获取写锁进行数据更新。

ReentrantReadWriteLock并不支持锁升级(把持读锁,获取写锁,最后释放读锁的过程)。目的也是保证数据可见性。如果读锁已经被多个线程获取,其中任意线程成功获取了写锁并更新了数据,则其更新数其他获取到读锁的线程是不可见的。

 


理解:在jdk api中对ReentrantReadWriteLock可重入读写锁的加锁顺序的必要性

 class CachedData {
   Object data;
   volatile boolean cacheValid;
   ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

   void processCachedData() {
     rwl.readLock().lock();
     if (!cacheValid) {
        // Must release read lock before acquiring write lock
        rwl.readLock().unlock();
        rwl.writeLock().lock();
        // Recheck state because another thread might have acquired
        //   write lock and changed state before we did.
        if (!cacheValid) {
          data = ...
          cacheValid = true;
        }
        // Downgrade by acquiring read lock before releasing write lock
        rwl.readLock().lock();
        rwl.writeLock().unlock(); // Unlock write, still hold read
     }

     use(data);
     rwl.readLock().unlock();
   }
 }


2、读写锁技术的妙用---读写锁实现缓存

      代码处没有使用降级锁的顺序,多加了一个if判断,避免了其出错

public class CacheDemo {
	private Map<String, Object> cache = new HashMap<String, Object>();
	
	public static void main(String[] args) {
	}
	 
	private ReadWriteLock lock = new ReentrantReadWriteLock();
	 
	 public Object cache(Object value){
		 Object retVal = cache.get(value);
		 lock.readLock().lock();
		 try{
			 if(retVal==null){
				  lock.readLock().unlock();
				  lock.writeLock().lock();
				  try{
					  if(retVal==null){     //此处锁的顺序没有符合降级锁的顺序,但是多加了一个if判断,不会有其影响
						  retVal ="aaa";  //实际上去查询数据库
					  }
				  }
				  finally{
					  lock.writeLock().unlock();
				  }
				  lock.readLock().lock();
			 }
		 }
		 finally{
			 lock.readLock().unlock();
		 }
		 return retVal;
	 }
}




别再只用LSTM了!用Temporal Fusion Transformer (TFT) 搞定多变量时序预测,附PyTorch实战代码 本文介绍了Temporal Fusion Transformer (TFT) 在多变量时序预测中的优势,并提供了PyTorch实战代码。TFT通过三重注意力机制解决了LSTM在特征交互、静态特征处理和解释性方面的不足,显著提升了预测精度和可解释性。文章详细讲解了TFT的核心组件构建、数据预处理、模型训练技巧及可解释性分析,帮助开发者快速掌握这一先进时序预测技术。 阅读详情

相关推荐

实战指南:如何用Kamailio+FreeSWITCH搭建高并发企业通信系统(附配置模板)

本文提供了一份实战指南,详细介绍了如何利用Kamailio与FreeSWITCH构建高并发企业通信系统。通过将Kamailio作为高性能SIP信令平面处理路由与负载均衡,FreeSWITCH作为媒体与应用平面负责通话与业务逻辑,实现信令与媒体分离的电信级架构。文章深入解析了架构设计、核心配置、集群部署与性能优化,并附有配置模板,旨在帮助企业构建可水平扩展、高可用的通信解决方案。

dell8的博客 364

redis进阶-读写锁,缓存击穿、穿透、雪崩,双写不一致,key过期策略

redis客户端线程池核心参数 maxTotal: maxIdle: minIdle: redis启动后,线程池默认没有连接,当需要执行命令,则会去创建连接,并放入连接池 管道 setnx命令 redisson通过lua脚本的原子性实现分布式锁,并实现了看门狗锁续命的逻辑 redisson实现读写锁 public static void main(String[] args) { JedisPoolConfig jedisPoolConfig = new Jedis.

weixin_36279234的博客 1406

Workbench中直接调用ICEM CFD进行网格划分

自从ANSYS 12.0之后,ICEM CFD就从Workbench中被分离出去,作为一个独立的程序使用了。取而代之的是Meshing模块。 在Meshing的属性节点菜单中右键点击Mesh,选择Insert > Method,插入方法。 选择需要划分网格的几何体,点击apply。此时Geometry显示为1 Body。 设置Method为MultiZone,如果不设置成这个的话,找不到进入ICEM CFD的入口。如果要划分四面体,可以在Mapped Mesh Type中选择其他类型。

Yan的博客 6510

15、操作系统——读写锁

操作系统——读写锁

weixin_45981798的博客 552

Xilinx PL端DP显示接口开发实战(一)——环境搭建与硬件选型

本文详细介绍了Xilinx PL端DP显示接口开发的环境搭建与硬件选型实战经验。从Vivado和Vitis 2021.1版本的软件安装要点,到DP141和MCDP6000芯片的选型建议,再到DP1.4接口的RX/TX方向开发关键点,为开发者提供了全面的技术指导。文章还分享了IP核配置、BD原理图设计以及常见问题排查的实用技巧,帮助开发者高效完成Xilinx DP接口开发项目。

weixin_29250573的博客 171

四参数与七参数坐标转换含义及区别

一.前言 不同坐标系,其椭球体的长半径,短半径和扁率是不同的。比如我们常用的四种坐标系北京54、西安80、WGS84、CGCS2000所对应的椭球体,它们的椭球体参数就各不相同。而不同空间直角坐标系之间的转换一般通过七参数或者四参数来实现坐标转换。 二.四参数转换 两个不同的二维平面直角坐标系之间转换通常使用四参数模型,四参数适合小范围测区的空间坐标转换,相对于七参数转换的优势在于只需要2个公共已知点就能进行转换,操作简单。 在该模型中有四个未知参数,即: (1)两个坐标平...

尘海折柳的博客 1万+

死锁与读写锁

死锁(Deadlock)是在并发计算中的一种状态,其中两个或多个进程无法继续执行,因为每个进程都在等待另一个进程释放所占用的资源。这种情况通常发生在系统中的资源分配过程中,其中每个进程都占用一些资源,并且正在等待其他进程释放它们所占用的资源,从而导致所有进程都无法继续执行。 如果有其它线程读数据,则允许其它线程执行读操作,但不允许写操作。◼ 在对数据的读写操作中,更多的是读操作,写操作较少,例如对数据库数据的读写应用。读取这个共享资源,但是由于互斥锁的排它性,所有其它线程都无法获取锁,也就无法读。

leimeili的博客 679

手把手教你用8位单片机IO口直接驱动WS2812灯带(附完整代码和避坑指南)

本文详细介绍了如何使用8位单片机IO口直接驱动WS2812灯带,包括硬件准备、时序生成、色彩引擎与特效算法的实现,以及调试技巧与性能优化。通过汇编语言优化和精确时序控制,实现高效的LED驱动和炫酷的彩虹灯效,适合嵌入式开发者和硬件爱好者参考。

weixin_42696271的博客 304

利用Java的读写锁实现缓存的设计

java 缓存实现及读写锁

scott198512的博客 752

图像修复黑科技:对比BM3D/DnCNN等5种去噪器在PNP框架中的实战效果

本文深度评测了BM3D、DnCNN等五款主流去噪器在即插即用(PnP)优化框架中的实战表现。通过量化指标、视觉对比及超分等泛化任务测试,揭示了深度学习模型在性能与收敛速度上的优势,并为不同应用场景提供了选型指南与工程化建议。

weixin_29065959的博客 366

CVPR2021 CenterPoint源码解读:从VoxelNet到两阶段优化的完整实现细节

本文深度解析了CVPR 2021 CenterPoint模型的完整实现细节,从VoxelNet体素化、稀疏卷积Backbone,到基于中心点的检测头与两阶段精修机制。文章提供了从环境搭建、数据预处理到核心代码模块(如热力图生成、关键点特征提取与MLP Refiner)的实战指南,并分享了训练策略、多任务损失调优及可视化调试等关键工程实践,助力开发者深入理解并复现这一高效的3D目标检测框架。

linux的博客 470

怎样用读写锁快速实现一个缓存?

1)SDK已经有管程了,不是可以解决所有的并发问题的吗,为什么还要有读写锁? 不同的场景下使用不同的锁效果是不一样的,我们的读写锁用在读多写少的场景下那是非常有用的。 2)读写锁是我们JAVA特有的吗?他有什么原则? 读写锁并不是java特有的,是通用的一个技术方案。读写锁的话有三个基本原则: 同一时刻,允许多个线程去读一个变量 同一时刻,只允许一个线程去写变量 当有一个线程在写变量的时候,是不能读的 3)读写锁在java中是怎样实现的,怎

HongYu012的博客 850

跨越边界:用MessagePipe实现无缝的进程间通信

MessagePipe是一个用于.NET平台的消息传递库,它专注于简化异步消息处理和进程间通信。通过提供一系列易于使用的API,开发者可以快速搭建起稳定可靠的通信管道,支持多种传输协议(如TCP、Unix域套接字等),并内置了序列化/反序列化功能,使得跨语言和跨平台的数据交换变得轻而易举。为了方便序列化和反序列化操作,我们需要为每种消息定义对应的类或结构体,并标记属性。这样可以确保消息在发送方和接收方之间正确无误地传递。[Key0set;[Key1set;

墨夶的博客 816

Linux系统编程:深入理解读写锁的原理与应用

本文深入探讨了Linux系统中的读写锁机制,重点分析了其设计原理、实现方式及适用场景。文章首先对比了读写锁与传统互斥锁的区别,指出读写锁在读多写少场景下的性能优势。通过伪代码和流程图详细解析了读写锁的内部实现机制,包括状态维护、获取流程和释放策略。同时提供了性能测试数据,显示读写锁在读远多于写的情况下可获得5倍以上的性能提升。文章还列举了配置管理和缓存系统两个实际应用案例,并给出了使用注意事项和最佳实践。最后,介绍了RCU、Seqlock等替代方案,强调应根据具体场景选择合适同步机制。

软件科学-郝学胜 1323

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

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Golang中读写锁的底层实现

读写锁是一种并发控制机制,它允许多个线程同时对共享资源进行读访问,但在进行写操作时需要互斥访问,以确保数据的一致性和完整性。读写锁的主要功能是提高系统在读多写少场景下的并发处理能力,从而提升整体性能。读写锁在实际应用中扮演着重要的角色,可以有效地降低系统的并发访问冲突,提高系统的并发处理能力,同时也能够避免写操作对读操作的阻塞,从而减少了线程的等待时间,提升了系统的整体响应速度。w Mutex // 互斥锁L *Locker本文介绍了如何在Go语言中使用读写锁的应用实例。

qq_42538588的博客 1516

OV9734 DATASHEET,完整规格书

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

深入理解 Golang 读写锁原理

读写锁将操作分为读操作和写操作。读操作可以多个协程同时进行,写操作则必须独占,且写操作与读操作互斥。Golang 读写锁通过巧妙的结构设计和复杂的流程控制,实现了高效的读写并发控制。在实际应用中,合理使用读写锁能够显著提升程序在多读少写场景下的性能。理解其底层原理有助于我们更好地优化并发程序,避免因不当使用锁而导致的性能问题或死锁等情况。通过对读写锁的深入学习,我们能在并发编程领域迈出更加坚实的步伐。

m0_57836225的博客 1244

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...

深入理解读写锁 ReadWriteLock

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

weixin_56018532的博客 1025

Redis读写锁:原理与优化

在分布式系统中,数据一致性和并发控制是至关重要的。以Redis为例,作为一款高性能的键值存储系统,其读写操作的高并发处理能力尤为关键。然而,在多线程环境下,如何保证数据的一致性和提高并发性能,成为了一个亟待解决的问题。这就引出了Redis中的读写锁机制。读写锁(Read-Write Lock)是一种同步机制,允许多个线程同时读取数据,但在写入数据时,会阻止其他线程进行读写操作。这种机制在Redis中尤为重要,因为它能够有效平衡读多写少的场景,提高系统的并发性能。

我是Java程序员廖志伟,感谢朋友们的支持! 892

用于缓存的读写锁

看了张孝祥老师的读写锁视频后,觉得不太容易理解,今天专门研究了一下 官文介绍: 读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者

chinoukin的博客 639

深入理解读写锁的底层原理

深入理解读写锁的底层原理

daweias的博客 265

【JUC系列-09】深入理解ReentrantReadWriteLock的底层实现

深入理解ReentrantReadWriteLock 的底层实现

zhenghuishengq的博客 6652

深入理解Java并发读写锁——ReentrantReadWriteLock

若当前线程不是第一个读线程,那么首先会获取缓存计数器(上一个读锁线程对应的计数器 ),若计数器为空或者tid不等于当前线程的tid值,则获取当前线程的计数器,如果计数器的计数count小于等于1,则移除当前线程对应的计数器,如果计数器的计数count小于等于0,则抛出异常,之后再减少计数即可。如果当前线程获取读锁,即遵循锁降级的步骤,则线程T将会被阻塞,直到当前线程使用数据并释放读锁之后,线程T才能获取写锁进行数据更新。若存在,则需要被阻塞,否则,无需阻塞),之后在设置状态state,然后返回true。

sdgfafg_25的博客 978

Java 并发编程:深入理解 ReadWriteLock 读写锁

读锁(共享锁):允许多个线程同时获取和持有写锁(排他锁):只允许一个线程获取和持有这种设计特别适合 "读多写少" 的场景,能在保证线程安全的同时显著提升并发性能。ReadWriteLock 通过区分读写操作,在保证线程安全的同时,极大地提高了读多写少场景下的并发性能。它是 Java 并发包中一个非常实用的工具,合理使用能显著提升系统性能。与普通的 synchronized 关键字或 ReentrantLock 相比,ReadWriteLock 为特定场景提供了更精细的控制和更高的并发度。

优快云_xysf的博客 786
上一篇: java5的线程锁技术-笔记整理9
下一篇: java5条件阻塞Condition的应用-多路等待通知Lock-Condition使用-笔记整理10
马克吐温
博客等级 码龄10年 11粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值