Redisson 分布式锁源码 07:公平锁释放
前言#
看门狗机制是在 RedissonBaseLock#scheduleExpirationRenewal
方法中,这块公平锁和非公平锁并无区别。
前文已经了解到,公平锁加锁失败之后,会将当前放到等待队列中,通过 Java 代码中的循环不断尝试获得锁。
锁释放#
主动释放#
源码:RedissonFairLock#unlockInnerAsync
- KEYS[1]:加锁的名字,
anyLock
; - KEYS[2]:加锁等待队列,
redisson_lock_queue:{anyLock}
; - KEYS[3]:等待队列中线程锁时间的 set 集合,
redisson_lock_timeout:{anyLock}
,是按照锁的时间戳存放到集合中的; - KEYS[4]:
redisson_lock__channel:{anyLock}
; - ARGV[1]:LockPubSub.UNLOCK_MESSAGE;
- ARGV[2]:锁超时时间 30000;
- ARGV[3]:UUID:ThreadId 组合
58f6c4a2-9908-4957-b229-283a45359c4b:47
; - ARGV[4]:currentTime 当前时间戳。
这块逻辑突出部分已经标出,重点就是释放锁。
- 锁在队列中,超时了则直接从队列中移除;
- 锁减少重入次数,减少后,如果重入次数大于 0,重置超时时间,如果不大于 0,则直接移除锁。
这样的话后续就其他线程从等待队列中开始获得锁。
超时删除#
在加锁和释放锁的 lua 脚本中,第一段永远是一个 while true do xxx
,作用就是用来移除队列中超时的锁。
而持锁线程的释放,则和非公平锁没有任何区别,当锁超时或者服务宕机,锁就会被自动释放。(这个是指 anyLock)。
总结#
公平锁的释放同样分为主动释放和超时释放。
- 主动释放,即自己调用释放锁。
- 超时删除,则分为两种,一种是持锁线程超时删除,这种和非公平锁没有任何区别,因为这个锁也是含有超时时间+看门狗续租的。另一种则是等待队列中的超时删除,是在每次获取锁之前,判断第一个等待线程的时间戳是否超时,从而移除锁。
相关推荐#
作者:程序员小航
出处:https://www.cnblogs.com/liuzhihang/p/14989297.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎关注个人公众号:『 程序员小航 』
分类:
分布式锁
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!