抽象类通过模板方法模式封装分布式锁流程,定义lock()/unlock()抽象方法由子类实现,提供final的executewithlock()统一调度,并保障异常时自动解锁、身份校验与可扩展钩子。

抽象类本身不能直接管理分布式锁的生命周期,但它可以定义统一的加锁与解锁流程模板,把具体实现(如 Redis、ZooKeeper 等)延迟到子类中完成。核心思路是:用模板方法模式封装“获取锁 → 执行业务 → 释放锁”的通用流程,同时强制子类提供具体的加锁、解锁逻辑。
定义抽象锁管理器骨架
创建一个抽象类,声明抽象方法用于实际加锁和解锁,并提供 final 的模板方法控制整体流程:
- lock() 和 unlock() 是抽象方法,由子类实现具体分布式锁逻辑(例如基于 Redisson 的 tryLock / unlock,或 Curator 的 InterProcessMutex)
-
executeWithLock(Runnable task) 或
T executeWithLock(Supplier 是 final 方法,内部按顺序调用 lock() → 执行业务 → unlock(),并处理异常时的自动释放task) - 可加入超时参数、重试机制、锁标识(lockKey)等通用字段,由子类在构造时传入或配置
确保解锁的可靠性
分布式环境下,解锁必须具备原子性与安全性,抽象类可通过以下方式约束子类:
- 要求子类的 unlock() 必须判断锁持有者身份(如通过 UUID + Lua 脚本),避免误删他人锁
- 在模板方法中使用 try-finally 结构,保证即使业务代码抛异常,unlock() 仍会被执行
- 提供默认的锁自动续期(watchdog)开关,由子类决定是否启用(如 Redisson 默认开启,自研 Redis 锁需手动实现)
支持可扩展的上下文与回调
为适配不同场景(如日志追踪、监控埋点、重入控制),抽象类可预留钩子方法:
- beforeLock() 和 afterUnlock() 作为 protected 空方法,子类按需重写
- 允许传入 LockContext 对象(含 traceId、业务类型、租期等),统一透传给子类实现
- 支持设置锁失败后的 fallback 行为(如降级、排队、抛定制异常),通过策略接口注入而非硬编码
典型子类实现示意(Redis 方式)
例如继承该抽象类的 RedisDistributedLock 类:
- 在 lock() 中使用 SET key value NX PX timeout 实现加锁,并校验返回值
- 在 unlock() 中执行 Lua 脚本:先检查 key 存在且值匹配,再 DEL,保证原子性
- 复用抽象类提供的 executeWithLock(...),业务方只需关注核心逻辑,无需操心锁生命周期
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











