竞态条件

最后更新: 2025-12-17

竞态条件(race condition),又称竞争危害(race hazard)

当系统/程序的行为依赖于事件或操作执行的相对时序,而这些时序无法保证时发生。

特征:

  • 关注操作的顺序而非直接的内存访问
  • 逻辑错误,而非内存访问错误
  • 在更加广泛的概念中,数据竞争也是竞态条件的一种

示例:

JavaScript
1// 开始加载数据 2const dataPromise = fetch(`/api/user/${userId}`) 3 4// 用户在此期间切换页面 5navigateTo('otherPage') 6 7// 返回数据时,上下文可能已经无效 8renderUserDate(await dataPromise)

数据竞争(data race)

当多个线程/进程在没有适当同步的情况下同时访问同一内存位置,且至少有一个访问是写入操作时发生。

特征:

  • 涉及共享内存/变量的直接并发访问
  • 至少有一个线程在写入
  • 没有同步机制(锁、原子操作等)
  • 可能导致数据损坏、读取到部分写入的值

示例:

JavaScript
1// 共享变量 2var counter = 0; 3 4// 线程1 5function increment() { 6 counter++; 7} 8 9// 线程2 10function decrement() { 11 counter--; 12}

可能的损坏结果:

Plain
1初始值: counter = 5 2线程1: 读取5 → 计算6 3线程2: 读取5 → 计算4(在T1写入前读取) 4线程1: 写入6 5线程2: 写入4 6最终结果: 4(应该是5