
竞态条件不是某个动作本身做错了,而是多个动作共享同一状态时,结果意外取决于谁先发生。系统本来只关心“做了什么”,最后却被“恰好何时做”左右。
例如只剩一张票,两名顾客几乎同时查询,都看见“还有一张”,随后各自付款。如果“查看余票”和“扣减余票”是分开的,两个单独合理的流程可能卖出同一张票。问题不在顾客竞争,而在共享状态缺少足够约束。
竞态与普通的先后顺序不同:若顺序本来就是规则的一部分,先到先得并非错误;它也不同于死锁,后者是各方互相等待而无法继续。处理竞态的关键,是把必须共同成立的检查与修改保护起来,或让冲突能够被发现并重试。这个概念提醒我们:当多人、程序或机构同时改变同一件事时,时机本身也可能成为系统的一部分。
了解 Geoffrey Chen 的更多信息
订阅后即可通过电子邮件收到最新文章。