步骤 2 / 9
为什么会交错执行
线程随时可能被换下,或者在另一个核心上真正同时运行。
单核上,时钟中断可能恰好在“读出”和“写回”之间把线程换下去;多核上两个线程干脆同时在跑。 前端的 JS 是单线程,一段同步代码不会被打断,所以少见这个问题。 但两个异步请求先后返回、覆盖同一个状态,就是同一类问题。
操作系统
多个线程同时改同一份数据会出错,锁保证同一时刻只有一个线程在改。
以 Linux 上两个线程同时给计数器加 1、用 pthread_mutex 保护为例。
步骤 2 / 9
线程随时可能被换下,或者在另一个核心上真正同时运行。
单核上,时钟中断可能恰好在“读出”和“写回”之间把线程换下去;多核上两个线程干脆同时在跑。 前端的 JS 是单线程,一段同步代码不会被打断,所以少见这个问题。 但两个异步请求先后返回、覆盖同一个状态,就是同一类问题。
| 当前状态 | 发生了什么 |
|---|---|
| 两个线程同时运行 | 两个线程读到同一个旧值,更新丢失 |
| 交错执行 | 执行顺序不可预测 |