协程进阶:同步 01. 共享状态导致的并发问题

本篇解析 example-sync-01.kt。探讨在协程中使用普通变量进行并发累加时的错误。

1. 核心现象:数据丢失 (Race Condition)

当我们在多个并发协程中同时修改一个普通的全局变量时,会发生“竞态条件”。

代码解析

1
2
3
4
5
6
7
var counter = 0
withContext(Dispatchers.Default) {
massiveRun {
counter++
}
}
// 预期:100000,实际:可能只有 70000 多
  • 原因counter++ 并不是一个原子操作。它包含了“读取-修改-写入”三个步骤。在多线程环境下,多个协程可能同时读取了旧值,导致部分加法操作被覆盖。

2. 开发者感悟

协程虽然轻量,但只要它运行在多线程调度器(如 Dispatchers.Default)上,就必须面对传统的多线程同步问题。永远不要假设协程内部的代码是天然线程安全的。

,