竞态条件(race condition),又称竞争危害(race hazard)
当系统/程序的行为依赖于事件或操作执行的相对时序,而这些时序无法保证时发生。
特征:
- 关注操作的顺序而非直接的内存访问
- 逻辑错误,而非内存访问错误
- 在更加广泛的概念中,数据竞争也是竞态条件的一种
示例:
JavaScript1// 开始加载数据 2const dataPromise = fetch(`/api/user/${userId}`) 3 4// 用户在此期间切换页面 5navigateTo('otherPage') 6 7// 返回数据时,上下文可能已经无效 8renderUserDate(await dataPromise)
数据竞争(data race)
当多个线程/进程在没有适当同步的情况下同时访问同一内存位置,且至少有一个访问是写入操作时发生。
特征:
- 涉及共享内存/变量的直接并发访问
- 至少有一个线程在写入
- 没有同步机制(锁、原子操作等)
- 可能导致数据损坏、读取到部分写入的值
示例:
JavaScript1// 共享变量
2var counter = 0;
3
4// 线程1
5function increment() {
6 counter++;
7}
8
9// 线程2
10function decrement() {
11 counter--;
12}
可能的损坏结果:
Plain1初始值: counter = 5 2线程1: 读取5 → 计算6 3线程2: 读取5 → 计算4(在T1写入前读取) 4线程1: 写入6 5线程2: 写入4 6最终结果: 4(应该是5)