Redisson 分布式锁源码 03:可重入锁互斥
前言#
看过可重入锁的 Lua 脚本,已经可以知道当锁存在时,是会加锁失败的。
下面看一下,加锁失败之后是如何处理的呢?
加锁 Lua 脚本#
在 lua 脚本中,前两段 if 分别排除了两种情况:
- 锁不存在;
- 锁存在且是自己线程(可重入);
剩下的情况就是锁存在,但是不是自己,也就意味着加锁失败。
执行 pttl
命令,返回锁的剩余时间。
加锁失败后的处理#
源码定位:org.redisson.RedissonLock#lock(long, java.util.concurrent.TimeUnit, boolean)
先来看开头一部分:
加锁成功后,会返回 ttl,此处会判断为 null,直接返回。
所以,下面的部分就是当获取锁失败之后的逻辑。
忽略掉不需要很关注的逻辑,重点则是 while (true)
里面这一小块。
一直循环调用 tryAcquire 方法,直到加锁成功!
总结#
- 可重入锁的互斥是依靠 Redis Lua 脚本来保证的;
- 加锁失败会返回当前锁的剩余时间;
- 加锁失败后,会在 Java 代码中使用 while 循环一直尝试加锁。
大概的流程,如下图:
相关推荐#
作者:程序员小航
出处:https://www.cnblogs.com/liuzhihang/p/14970690.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 模型,支持深度思考和联网搜索!