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 时序图,直观展示"等待、持锁、看门狗续期、释放锁"的流程,让整个逻辑一眼就看懂。

你希望我画吗?

相关推荐
现任明教教主~27 分钟前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
excel40 分钟前
prisma 如何处理数据库竞态
前端·数据库·后端
Zhou1411361 小时前
SpringSecurity_02_授权与高级功能
开发语言·python
知行产研1 小时前
易控智驾:毛利率跃升17.2个百分点,矿山无人驾驶从“规模换增长“迈入“盈利拐点“
数据库·mysql
一条破秋裤1 小时前
Linux 线程创建:pthread_create 与基本回收
java·linux·运维
千里码aicood1 小时前
基于CART算法的图书分类系统设计与实现
数据库·算法·分类
布吉岛的石头1 小时前
Java 程序员第 49 阶段5:BERT 预训练目标 MLM+NSP 的工程含义
java·人工智能·深度学习·bert·transformer
码匠许师傅1 小时前
【C++三方组件】cpp-httplib:一个头文件起 HTTP 服务
开发语言·c++·http
饺子大魔王的男人2 小时前
Redis 内存和连接异常怎么排查?用 redis_exporter 搭一套可远程抓取的监控链路
数据库·redis·bootstrap