怎么处理由于守护线程 finally 不执行导致的分布式锁未释放、未解锁的严重线上故障

轻明吖_9773

轻明吖_9773

2026-06-01

743人浏览

原创

redisson看门狗机制默认启用,当调用lock()或trylock()未指定leasetime时,启动后台守护线程每10秒执行lua脚本续期锁(默认30秒租期),校验线程id确保安全;续期失败则锁按原ttl自动过期。

怎么处理由于守护线程 finally 不执行导致的分布式锁未释放、未解锁的严重线上故障

守护线程中 finally 块未执行,本质上是锁释放逻辑被跳过——这不是 Redis 锁本身的缺陷,而是业务代码与线程生命周期配合失当引发的严重故障。核心问题在于:**把锁的生命周期错误地绑定在了可能提前终止的守护线程上,而没做兜底保障。**

必须避免在守护线程里直接管理锁释放

守护线程(Daemon Thread)会在 JVM 退出时被强制终止,不等待其执行完毕。一旦业务逻辑卡在耗时操作中、JVM 因 OOM 或 kill -9 被干掉,或线程被意外中断,try...finally 就彻底失效,锁永远滞留在 Redis 中。

  • 不要写类似 new Thread(() -> { try { lock.lock(); doWork(); } finally { lock.unlock(); } }).setDaemon(true).start();
  • 守护线程适合做日志刷盘、指标上报等“尽力而为”型任务,不适合承担锁这种强一致性责任。

用 Redisson 的看门狗机制替代手动守护

Redisson 的 RLock 默认启用 Watch Dog(看门狗),它不是靠用户启一个守护线程,而是由 Redisson 内部的独立 Netty EventLoop 线程池驱动续期。只要客户端连接存活,它就会每 10 秒(默认为锁 TTL 的 1/3)自动刷新锁的过期时间,且续期失败会触发告警而非静默失败。

Tbox
Tbox

Tbox是一款AI智能体工具,蚂蚁集团旗下多智能体协同的通用 AI Agent。

下载
  • 加锁时无需指定过期时间:lock.tryLock() 即可启用自动续期(默认 TTL=30s)
  • 业务完成调用 unlock() 后,看门狗自动停止,不会残留后台任务
  • 即使业务线程卡住、OOM 或被中断,只要 Redisson 客户端连接未断,锁就不会提前释放;若连接断开(如网络故障),锁也会按原 TTL 自动过期

加双重保险:锁自带过期 + 主动释放 + 异常兜底

不能只依赖看门狗。生产环境需组合三重防护:

  • 加锁带基础 TTL:使用 tryLock(waitTime, leaseTime, TimeUnit),明确设置 leaseTime(如 60 秒)。这是最后防线,确保哪怕看门狗失灵,锁也最多占用 60 秒
  • 业务层主动释放:在业务逻辑结束处调用 unlock(),并捕获 IllegalMonitorStateException(表示当前线程并未持有该锁,可能是已过期或被别人释放)
  • 异常兜底清理:在全局异常处理器(如 Spring 的 @ControllerAdvice)或关键方法 catch 块中,检查锁是否仍被本线程持有(lock.isHeldByCurrentThread()),若持有则强制 unlock

上线前必须做的验证动作

光写对没用,得验证它真能扛住故障:

  • 模拟 JVM 强制退出:在加锁后执行 Runtime.getRuntime().halt(1),观察 Redis 中 key 是否在 TTL 后自动消失(而不是永久存在)
  • 模拟网络分区:停掉 Redis 节点几秒再恢复,检查看门狗日志是否报错、锁是否正常续期或安全过期
  • 压测超时场景:人为让业务逻辑执行时间 > leaseTime,确认看门狗是否持续续期,且最终 unlock 不抛异常

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10477

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7602

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6632

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1144

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

928

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1376

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2749

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20071

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1215

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习