数据竞争通常指多个执行单元并发访问同一内存位置,其中至少一个是写入,而且缺少所需的同步关系。具体判定应遵循语言的内存模型。
风险与修复
共享计数器的读、加一、写回可能被交错执行,造成更新丢失;单个字段的读写看似简单,也不保证复合操作安全。可通过互斥锁、原子操作或明确的状态所有权建立同步。
业务竞态的范围更广:即使内存访问已同步,“先检查库存、后扣减”跨数据库请求仍可能产生竞争。语言检测器无法证明整个业务流程正确。
检测
以 Go 为例,可使用 go test -race 检测运行过程中出现的数据竞争。没有报告仅说明本次执行未检测到问题,不能证明所有调度路径均安全。