竞态条件Race Condition
你可能会说
优惠券偶尔会超发,但单次测试又正常。请按并发时序复现这个竞态条件,再修复并重复验证。
竞态条件是一类由并发操作的执行顺序决定最终结果的问题。例如最后一张优惠券被两个请求同时读取并发放,谁先读、谁先写会决定是否超发,所以问题只在某些时序下出现。竞态条件不只等于数据竞争;请求顺序、文件状态或事件先后也可能形成竞态,一次测试通过不能证明它不存在。
先知道
也常被叫作竞态Race Condition
延伸阅读 · 权威出处
优惠券偶尔会超发,但单次测试又正常。请按并发时序复现这个竞态条件,再修复并重复验证。
错误取决于两个请求谁先读、谁先写。
问题与关键机制:两个请求都从剩余 1 开始,读写交错不同会偶尔发出两张;让并发测试记录每次读取、写入的请求 ID、值和时间,把时序反馈带回同一轮运行。
改善看重复运行是否稳定:用原子更新或匹配范围的锁修复后,多轮并发测试都只有一个成功、库存为 0;这仍不能证明系统所有位置都没有竞态。
第二个场景:头像管理:用户上传新头像后马上撤销时,上传与删除完成的先后不同,头像可能偶尔重新出现;记录时序并重复测试,确认最终状态始终以最后一次操作为准。
请为最后一张优惠券写一个可重复的并发测试,让两个请求从同一初始状态同时领取。记录请求 ID、读取值、写入结果和时序,复现竞态后用原子更新或正确的锁范围修复。重复运行,确认每次都只有一个成功且库存为 0;不要用单次通过作为结论。