锁租期一分钟但任务未完成时,会发生什么?
未标记
考查重点:租期失效与旧任务继续执行。到期未续别人可拿锁,旧任务不自动停,用续约/超时/fencing 防旧写
本题目录
参考答案
核心回答
如果是一分钟的固定租期,且没有成功续约,锁到期后其他客户端就可能重新获得锁;原任务通常不会因此被自动中断。于是旧任务还没结束、新任务又进入临界区,可能出现重复处理和并发写入。
关键要确认“一分钟”指的是固定 leaseTime,还是某种自动续约机制的租约周期。两者的行为不同。Redisson 普通 RLock 指定正的固定租期时,不能再假定看门狗会替它续期。
一个典型时间线
A 在第 0 秒取得锁,租期 60 秒;任务因为慢调用或长暂停未结束。到第 60 秒,若锁仍未续约,A 的租约失效。B 随后获取同一把锁并开始工作。A 在第 65 秒恢复后,可能仍按旧上下文继续操作共享资源。
锁服务只知道租约到期,并不知道 A 的业务线程是否已经停下。即使 A 在写入前检查“锁还在不在”,检查和真正写入之间仍可能过期,不能仅靠一次本地判断封闭竞争窗口。
怎样控制风险
任务时间可预测且临界区短时,可以选择覆盖实际耗时与合理波动的租期;时间不确定时,可使用到期前续约,并监控续约失败和剩余租期。但网络分区、GC 或进程暂停可能持续超过租约,续约不是绝对安全保证。
对重要写入,应让资源端参与判断。例如数据库按业务状态和版本条件更新,订单号唯一约束防止重复创建,或使用可靠生成且由下游原子校验的 fencing token 拒绝旧执行者。任务恢复与重试还需按业务幂等处理。
如果任务天然很长,可以拆成有明确状态和检查点的阶段,减少长时间持锁;对外副作用要记录请求与结果,避免重新接管后重复执行。
解锁时注意什么
解锁必须原子校验所有者,再释放对应的锁。A 的旧租约失效后,直接删除同名 Key 可能删掉 B 的新锁。Redisson 的持有线程语义也要求由合法所有者解锁;锁已丢失时出现异常,应按失去执行资格处理,不能吞掉后继续当成持锁成功。
常见追问
把租期改为十分钟呢? 只是调整过早到期与故障接管速度的取舍,仍存在任务超时和暂停风险;业务约束和恢复设计同样必要。
参考资料
- 国内:JavaGuide / Snailclimb:分布式锁入门:租约与安全释放部分解释锁到期后其他执行者为什么能重新获取,以及旧持有者不能无条件删除锁。
- 国内:JavaGuide / Snailclimb:分布式锁实现方案:参考固定租期与看门狗的对照,解释正文中一分钟固定到期和自动续约模式的区别。
- 国内:JavaGuide / Snailclimb:分布式协调:Lease 与 Fencing:租约与旧执行者例子解释到期回收资格不会停止业务线程,资源端还需拒绝迟到写。
- 国外:Redisson:Locks and synchronizers:依据 leaseTime 与 watchdog 的官方规则,说明正文中如何确认一分钟的含义及锁何时自动释放。
- 国外:Martin Kleppmann:How to do distributed locking:长暂停后恢复的例子解释双执行者重叠写入,以及 fencing 对关键资源的作用。

