Redisson的Lock和TryLock的区别

1️⃣ lock 方法

1.1 无参数版本

  • 行为:抢到锁后,线程会一直占有该锁

  • 线程挂掉:看门狗会持续续期锁

  • 风险:如果看门狗持续续期且线程未释放锁,其他线程阻塞等待 → 可能出现死锁

1.2 带参数版本 lock(leaseTime, unit)

  • 行为 :抢到锁后,锁会在 leaseTime 到期后自动释放

  • 线程挂掉 :锁仍会在 leaseTime 时间后释放,不依赖看门狗

  • 优势:避免线程异常或执行过长导致锁无限占用,降低死锁风险


2️⃣ tryLock 方法

2.1 两参数版本 tryLock(waitTime, unit)

  • 行为 :尝试获取锁,最多等待 waitTime(例如 3 秒)

  • 获取锁成功

    • 锁的过期时间由 Redisson 看门狗自动延长

    • 直到手动释放锁

  • 获取锁失败

    • 等待时间到仍未获取 → 返回 false

    • 不会继续抢锁

2.2 三参数版本 tryLock(waitTime, leaseTime, unit)

  • waitTime:最多等待多久尝试获取锁(例如 3 秒)

  • leaseTime:锁的自动释放时间,不依赖看门狗

  • 行为

    • 如果 3 秒内获取到锁 → 返回 true,锁会在 leaseTime 到期后自动释放

    • 超过 3 秒仍未获取锁 → 返回 false

  • 优势:即使业务方法执行未完成,锁也会自动释放,避免死锁


总结对比表

方法 参数 等待时间 锁持有时间 看门狗 死锁风险
lock() 无限 持有直到手动释放
lock(leaseTime) leaseTime 无限 最多 leaseTime
tryLock(waitTime) waitTime waitTime 看门狗延长 很低
tryLock(waitTime, leaseTime) waitTime, leaseTime waitTime leaseTime 很低

如果你希望,我可以帮你画一张 lock vs tryLock 时序图,直观展示"等待、持锁、看门狗续期、释放锁"的流程,让整个逻辑一眼就看懂。

你希望我画吗?

相关推荐
JH30731 小时前
为什么switch不支持long
java
gpfyyds6661 小时前
Python代码练习
开发语言·python
r i c k1 小时前
数据库系统学习笔记
数据库·笔记·学习
盐真卿2 小时前
python第八部分:高级特性(二)
java·开发语言
茉莉玫瑰花茶2 小时前
C++ 17 详细特性解析(5)
开发语言·c++·算法
上海合宙LuatOS2 小时前
LuatOS核心库API——【audio 】
java·网络·单片机·嵌入式硬件·物联网·音视频·硬件工程
lly2024062 小时前
《堆的 shift down》
开发语言
汤姆yu2 小时前
基于springboot的尿毒症健康管理系统
java·spring boot·后端
TT哇2 小时前
【实习】银行经理端线下领取扫码功能实现方案
java
野犬寒鸦2 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习