本篇解析 example-sync-01.kt。探讨在协程中使用普通变量进行并发累加时的错误。
1. 核心现象:数据丢失 (Race Condition)
当我们在多个并发协程中同时修改一个普通的全局变量时,会发生“竞态条件”。
代码解析
1 | var counter = 0 |
- 原因:
counter++并不是一个原子操作。它包含了“读取-修改-写入”三个步骤。在多线程环境下,多个协程可能同时读取了旧值,导致部分加法操作被覆盖。
2. 开发者感悟
协程虽然轻量,但只要它运行在多线程调度器(如 Dispatchers.Default)上,就必须面对传统的多线程同步问题。永远不要假设协程内部的代码是天然线程安全的。