Android 协程时代,出现 ReentrantLock 就是架构警报

在协程成为主流之后,我越来越坚定一个观点:

在现代 Android / Kotlin 项目中,
不要在业务层显式使用 AQS 同步器。

包括:

  • ReentrantLock
  • CountDownLatch
  • Semaphore
  • FutureTask
  • synchronized

不是因为它们不好。

而是因为------

它们属于更低一层的抽象。


一、什么叫"显式使用 AQS"?

不是指你写了多复杂的并发代码。

而是指:

在 Data 层 / UseCase 层直接操作线程同步器。

比如在 UseCase 里:

或者在 Repository 里:

在协程时代,这类代码基本可以判断为:

并发抽象层级发生错位。

问题不在语法。

问题在抽象。


二、问题不在"对错",而在"层级"

AQS(AbstractQueuedSynchronizer)解决的是:

  • 线程竞争
  • 线程阻塞
  • 等待队列管理
  • 线程级调度

它属于 JVM 并发模型的底层能力。

而你现在在用什么?

👉 协程。

协程的设计哲学是:

  • 挂起,而不是阻塞
  • 结构化并发
  • 任务级调度
  • 线程与任务解耦

当你在协程架构中使用 ReentrantLock,本质是在:

用线程模型解决任务模型的问题。

这就像在 Compose 里手动操作 View。

不是不能。

而是违背抽象边界。


三、线程阻塞 vs 协程挂起

来看最本质的差别。

ReentrantLock 的行为:

  1. 抢不到锁
  2. 阻塞线程
  3. 进入等待队列
  4. 被唤醒

Mutex 的行为:

  1. 抢不到锁
  2. 挂起协程
  3. 不占用线程
  4. 恢复 continuation

核心区别只有一个:

是否占用线程。

如果你在 Dispatchers.Default 中大量使用 ReentrantLock,你很可能会:

  • 卡住线程池
  • 降低并发度
  • 产生性能抖动
  • 出现难以排查的调度问题

这不是"锁用得不对"。

是抽象层级错位。


四、协程时代真正应该用什么?

在现代 Kotlin 项目里,业务层应该优先使用:

  • Mutex
  • Channel
  • Flow
  • StateFlow
  • async / await
  • structured concurrency

比如:

更进一步,可以通过:

  • actor 模型
  • 单线程 dispatcher
  • 状态流建模

来避免显式锁。

这才是协程模型内部的并发方式。


五、什么时候可以用 AQS?

只有两种情况:

1️⃣ 写底层库

  • 自定义线程池
  • 自定义并发框架
  • JVM 基础组件

2️⃣ 强交互 Java 旧系统

  • 旧模块是 Java
  • 依赖 JUC API
  • 桥接遗留系统

否则:

业务层尽量不要出现 AQS 同步器。


六、显式使用 AQS,通常暴露什么问题?

在业务层看到:

  • ReentrantLock
  • CountDownLatch
  • synchronized

通常意味着:

  • 并发模型没统一
  • 协程和线程混用
  • 结构化并发没有真正落地
  • 分层设计不清晰

这不是"并发很复杂"。

这是:

抽象边界没有建立。


七、协程时代的并发分层

更健康的分层应该是:

复制代码
业务层        → 协程原语
UseCase       → 协程编排
数据层        → 协程 + IO
底层基础库    → JVM 并发原语(可能包含 AQS)

而不是:

复制代码
UseCase 直接操作线程锁
Repository 手动管理等待队列

AQS 是地基。

业务代码不应该住在地基里。


八、一句话原则

在协程项目中,不要用线程锁解决协程问题。

AQS 没过时。

但它不属于你的业务代码层。


九、真正成熟项目的标志

一个真正成熟的 Kotlin 项目应该是:

  • 全面协程化
  • 结构化并发
  • 无阻塞设计
  • 明确抽象边界
  • 业务层不感知线程模型

协程不是替代线程。

协程是对线程的抽象升级。

而架构设计真正的能力是:

把低层抽象封装在底层

不让它污染上层业务。

AQS 是基础设施。

业务代码应该站在抽象之上,而不是回到线程时代。

相关推荐
stevenzqzq1 小时前
Android Jetpack Compose 列表开发指南:为什么你不需要再为底部 Item 写额外间距
android·android jetpack
撩得Android一次心动9 小时前
Jetpack Compose 知识点整理2【个人用】
android·笔记·学习·kotlin·compose
是真的小外套10 小时前
2024年软考中级信息安全工程师|选择题考点+案例分析真题解析(含答案)
android·网络
用户20187928316712 小时前
一文讲透 Android Native Heap 监控原理:一间"只进不出"的仓库,和总部派来的侦探
android
YB137513 小时前
Jetpack Compose 动画animate*AsState
android
高晶13 小时前
Android 通讯录应用开发实战:从零搭建 SQLite 数据持久化完整项目
android·设计模式·前端框架
隐擎fox14 小时前
深入 Android 移动端风控与协议层对抗:内核级虚拟环境检测、网络堆栈特征伪装与住宅 IP 协同实战
android·网络·python·网络协议·tcp/ip
换元不配限16 小时前
从 AsyncTask 到现代并发:Android 异步方案的演进与替代实践
android·asynctask·异步编程·方案对比·asynctask替代方案
用户20187928316716 小时前
你的 App 为什么是「电量刺客」?——从一条 WakeLock 追到 Linux 内核的 Android 省电原理全解
android