抽象类可通过封装统一锁、volatile状态标志、模板化加锁执行方法及condition条件等待机制,为子类提供线程安全基础设施。需声明protected final reentrantlock和volatile标志,提供executewithlock等受控模板方法,并禁止子类绕过同步契约。

抽象类本身不能直接“管理”多线程资源,但它可以作为统一的基类,定义并封装共享锁、同步状态和线程安全操作的契约与基础设施。关键在于:把锁对象、同步标志、加锁/释放逻辑、状态检查等共性内容提取到抽象类中,由子类按需复用或扩展。
定义统一的可重入锁与同步标志字段
在抽象类中声明 protected final ReentrantLock 和 protected volatile boolean 等字段,确保子类继承后能安全访问同一份锁实例和状态标识。避免每个子类自行 new 锁——否则就失去了“统一管理”的意义。
- 锁必须是 final(防止被子类意外替换)且 protected(供子类调用 lock()/unlock())
- 同步标志(如
isRunning、isInitialized)应为 volatile,保证可见性 - 不建议使用 synchronized(this),因为子类实例不同,无法跨实例同步
提供带保护的模板方法控制临界区
抽象类可定义 protected final void executeWithLock(Runnable action) 这类模板方法,在内部完成加锁、异常防护、自动释放,子类只需传入业务逻辑,无需重复写 try-finally。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 方法内使用
lock.lock(); try { ... } finally { lock.unlock(); }结构 - 可叠加状态校验,例如执行前检查
if (!isRunning) throw new IllegalStateException(); - 支持中断感知:用
lock.lockInterruptibly()替代lock(),让子类能响应中断
封装线程安全的状态转换与条件等待
若涉及等待/通知机制(如生产者-消费者),抽象类可持有 Condition 并暴露 waitUntilXXX() 等受控方法。所有子类共用同一个 Condition 实例,避免因锁对象不一致导致 signal 失效。
- 在构造器中初始化
condition = lock.newCondition(); - 提供
awaitUntilRunning()方法:先加锁,再 while(!isRunning) condition.await(); 最后解锁 - 子类触发状态变更时,统一调用
condition.signalAll(),而非自行 new Condition
禁止子类绕过同步契约
通过设计约束减少误用风险。例如将核心锁字段设为 private,仅暴露受控接口;将关键状态修改逻辑封装为 final 方法;对非线程安全的 setter 做运行时检查(如检测当前线程是否已持锁)。
- 不开放
lock字段的 getter,只提供isLocked()或tryLock(long, TimeUnit)等安全接口 - 状态变更方法如
start()、stop()设为 final,内部调用抽象钩子onStart()/onStop() - 可在抽象类中记录 ownerThread(配合 ThreadLocal),用于调试或非法重入检测
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










