Redisson 分布式锁源码 03:可重入锁互斥

前言#

看过可重入锁的 Lua 脚本,已经可以知道当锁存在时,是会加锁失败的。

下面看一下,加锁失败之后是如何处理的呢?

加锁 Lua 脚本#

在 lua 脚本中,前两段 if 分别排除了两种情况:

  1. 锁不存在;
  2. 锁存在且是自己线程(可重入);

剩下的情况就是锁存在,但是不是自己,也就意味着加锁失败。

执行 pttl 命令,返回锁的剩余时间。

加锁失败后的处理#

源码定位:org.redisson.RedissonLock#lock(long, java.util.concurrent.TimeUnit, boolean)

先来看开头一部分:

加锁成功后,会返回 ttl,此处会判断为 null,直接返回。

所以,下面的部分就是当获取锁失败之后的逻辑。

忽略掉不需要很关注的逻辑,重点则是 while (true) 里面这一小块。

一直循环调用 tryAcquire 方法,直到加锁成功!

总结#

  1. 可重入锁的互斥是依靠 Redis Lua 脚本来保证的;
  2. 加锁失败会返回当前锁的剩余时间;
  3. 加锁失败后,会在 Java 代码中使用 while 循环一直尝试加锁。

大概的流程,如下图:

相关推荐#

作者:程序员小航

出处:https://www.cnblogs.com/liuzhihang/p/14970690.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。


欢迎关注个人公众号:『 程序员小航 』

posted @   程序员小航  阅读(121)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu