建议看完人话版再看本文,会理解更加透彻:

Android开发:Kotlin协程并发模型(人话版)

Kotlin 协程并发模型,是 Android 开发中官方推荐的、基于 用户态协作式调度 + 结构化并发 的轻量级异步编程方案。它用同步风格的代码实现异步非阻塞执行,彻底解决了传统线程/回调的复杂度、内存泄漏和并发管理难题。


一、核心定义与本质

协程(Coroutine)

  • 用户态轻量级执行单元(非 OS 线程)
  • Kotlin 编译器 + 协程库 管理,而非操作系统内核
  • 内存极小(约 200–300 字节),可轻松启动 数万/数十万
  • 核心范式:非阻塞挂起(suspend) + 结构化并发(Structured Concurrency)

二、三大核心特性(并发模型基石)

1. 协作式调度(非抢占)

  • 线程:OS 抢占式调度(时间片用完强制切换,内核态开销大)
  • 协程主动挂起(suspend/await) 让出执行权
    • 只在挂起点切换:I/O、delay、await 等
    • 无内核态切换,开销 纳秒级(线程约微秒级)
    • 同一线程内协程串行执行,天然无锁、无竞态

2. 非阻塞挂起(suspend 函数)

suspend 标记的函数:

  • 暂停当前协程,不阻塞线程
  • 等待 I/O/结果时,线程去执行其他协程
  • 恢复时从挂起点继续(编译器生成状态机)
  • 代码写法:同步顺序,异步执行
// 示例:同步写法,异步非阻塞
suspend fun fetchUser(): User {
    val data = api.getUser() // 挂起(不阻塞主线程)
    return parse(data)       // 恢复后继续
}

3. 结构化并发(最关键安全机制)

协程必须在作用域(CoroutineScope)中运行

  • 父子层级:父协程管理所有子协程
  • 自动取消:父取消 → 所有子递归取消
  • 自动等待:父在所有子完成后才结束
  • 异常传播:子异常向上冒泡,全局安全

Android 内置作用域(防泄漏)

  • viewModelScope:ViewModel 销毁时自动取消
  • lifecycleScope:Activity/Fragment 生命周期销毁时取消
  • coroutineScope / supervisorScope:业务隔离

三、Kotlin 协程的 M:N 调度模型

Kotlin 采用 M:N 映射(M 协程 → N 线程):

  • M 个协程 多路复用 N 个内核线程(N ≤ CPU 核心数)
  • 调度器(Dispatcher)负责线程分配:
    • Dispatchers.Main —— Android 主线程(UI)
    • Dispatchers.IO —— I/O 密集(网络、文件,共享线程池)
    • Dispatchers.Default —— CPU 密集(计算)
  • 支持自由线程切换withContext(Dispatchers.IO) 无开销

四、协程 vs 线程(并发模型对比)

特性 传统线程/AsyncTask Kotlin 协程
调度主体 OS 内核(抢占式) 用户态库(协作式)
切换开销 高(μs 级、内核态) 极低(ns 级、用户态)
内存占用 1MB+/线程 200–300 字节/协程
并发量级 几千上限 数十万+
生命周期 手动管理(易泄漏) 结构化作用域(自动回收)
代码风格 回调嵌套(回调地狱) 同步顺序(线性可读性)
Android UI runOnUiThread 直接 Main 调度器更新

五、Android 开发中的核心价值

  1. 彻底解决回调地狱
    链式/嵌套 → 线性顺序代码
  2. 杜绝内存泄漏
    作用域绑定生命周期,自动取消所有任务
  3. 高并发轻量
    大量并发 I/O(网络请求、数据库)无压力
  4. 线程切换极简
    lifecycleScope.launch {
        val data = withContext(Dispatchers.IO) { api.getData() } // IO 线程
        tv_text.text = data // 自动切回主线程
    }
    
  5. 异常安全
    try-catch 直接捕获协程异常(含异步)

六、简单并发示例(并行请求)

// 并行获取两个数据,结构化并发
suspend fun loadData(): CombinedData = coroutineScope {
    val userDeferred = async(Dispatchers.IO) { api.getUser() }
    val newsDeferred = async(Dispatchers.IO) { api.getNews() }
    // 并行执行,同时等待
    CombinedData(userDeferred.await(), newsDeferred.await())
}

七、总结

Kotlin 协程并发模型 = 轻量级用户态执行单元 + 协作式非阻塞调度 + 结构化生命周期管理

它是 Android 现代并发的事实标准,兼顾:

  • 性能(低开销、高并发)
  • 安全(无泄漏、异常可控)
  • 简洁(同步写法、易维护)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐