Redisson解锁失败,WatchDog会不会一直续期下去? 目录一、WatchDog 底层续期规则Redisson 自动续期锁只针对lock()无过期时间的锁二、分场景详解解锁失败场景 1unlock () 抛出异常解锁失败但业务代码正常执行完毕线程退出场景 2unlock 没执行、业务线程卡死死循环 / 阻塞 / 休眠永不结束→ 解锁彻底失败场景 3Redis 手动 del 删除锁代码 unlock 失败三、如何避免解锁失败导致无限续期死锁解锁正常调用unlock()成功 → WatchDog 立刻停止续期解锁失败代码抛异常、手动删 key、解锁逻辑报错分两种场景业务线程正常结束方法走完 /returnWatchDog 自动停止续期不会永久续命业务线程卡死死循环 / 阻塞永不退出 unlock 没执行成功WatchDog 会无限续期锁永久占用一、WatchDog 底层续期规则Redisson 自动续期锁只针对lock()无过期时间的锁只有不带 leaseTime 参数的RLock.lock()才开启看门狗续期lock(10, TimeUnit.SECONDS)指定过期时间没有 WatchDog。默认续期间隔锁过期时间/2 15s默认锁超时 30s每 15s 异步刷新锁过期为 30s看门狗依附「持有锁的业务线程生命周期」业务线程存活 → 定时任务一直跑线程终止 → 定时任务被取消续期停止。二、分场景详解解锁失败场景 1unlock () 抛出异常解锁失败但业务代码正常执行完毕线程退出RLock lock redissonClient.getLock(key); lock.lock(); try { // 业务逻辑正常跑完 }finally { lock.unlock(); // unlock内部异常解锁失败 }finally 执行完当前持有锁的业务线程结束→ WatchDog 的定时续期任务被 cancel ()锁不再续期等待30s 自动过期释放不会死锁。unlock 源码解锁无论成功失败只要线程结束看门狗任务被注销。场景 2unlock 没执行、业务线程卡死死循环 / 阻塞 / 休眠永不结束→ 解锁彻底失败lock.lock(); try{ while(true){ // 线程无限死循环永不跳出try // 死循环卡死 } }finally { // 代码永远进不到finallyunlock从未执行 }线程一直存活WatchDog 定时任务持续执行每 15s 续期锁 30s →锁无限续命死锁常驻 Redis这是线上最容易出现死锁的场景。场景 3Redis 手动 del 删除锁代码 unlock 失败Redis 客户端手动DEL key把锁删掉下次看门狗续期时setnx 刷新过期失败直接取消续期任务不再续约。三、如何避免解锁失败导致无限续期死锁unlock 必须放到 finally 中保证必定执行解锁逻辑业务增加超时保护子任务设置超时熔断避免线程永久卡死担心 WatchDog 死续期改用lock(30, TimeUnit.SECONDS)手动指定过期关闭看门狗超时自动释放捕获 unlock 异常兜底补偿解锁finally { try { if(lock.isHeldByCurrentThread()){ lock.unlock(); } }catch (Exception e){ // 解锁异常兜底可发告警 } }isHeldByCurrentThread()校验当前线程是否持有锁防止释放别人的锁抛异常。