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