锁降级指的是写锁降级为读锁。
因为读锁与读锁之间不互斥,如果是写锁与读锁或者是写锁与写锁就会互斥,所以由写锁变为读锁就降级了。
如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种并不能称之为锁降级。
锁降级指的是把持住(当前拥有的)写锁,再获取到读锁,随后释放(先前有用的)写锁的过程。
下面给出一个锁降级的示例,当数据变动时,isUpdate变量被设置为false,此时所有所有readwrite()方法的线程都能感知到变化,但是只有一个线程能够获取到写锁,其他线程会被阻塞在读锁和写锁的lock()方法上;当前线程获取写锁完成数据准备之后,再获取读锁,随后释放写锁,完成锁降级。
为了保证数据的可见性,如果当前线程不获取读锁而是直接释放写锁,假设此时有另一个线程T获取了写锁并修改了数据,那么当前线程无法感知线程T的数据更新;但是如果当前线程获取读锁,则线程T会被阻塞,直到当前线程使用数据并施放读锁之后,线程T才能获取写锁进行数据更新。
用下面的代码来解释,若在注释2和注释6上并不加读锁的获取和释放(即//2和//6被注释掉),当前线程完成注释1的put操作后,进行注释3的写锁释放操作,若此时有另一个线程获得写锁并进行修改(即进行注释1操作),那么当前获得读锁的线程无法感知,在进行注释4和注释5操作时就会发生线程安全性问题。
若加上注释2和注释6,由于读锁和写锁之间是互斥的,当写锁释放的时候,由于注释2读锁的存在,新的线程并不能获得写锁,此时就保证了线程安全性。
来源:https://blog.csdn.net/u010512429/article/details/80011239
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架