/* Page prose (zh-Hans) */
"Overview" = "# 并发的陷阱\n\n你已经用队列把工作移出了主线程，用 Dispatch Group 等待批量任务，用信号量来限量分配访问。现在轮到那些锋利的边缘了。当两段工作在同一时刻碰到*同一个*值的那一刻，一类新的 bug 就出现了：它在你的机器上通过了每一个测试，发布上线，然后为千分之一的用户弄坏一个数字。想象一家叫号窗口的银行：一份共享的余额，一排柜员，所有人同时伸手去够抽屉。本章讲的是当他们不协调时会出什么问题，以及让他们变安全的那些经典工具。\n\n---\n\n## 你将学到\n\n* 什么是**竞态条件**和 **data race**，以及如何通过阅读代码发现它们。\n* 为什么竞争是**非确定性的**（大多数运行正确，少数运行错误），因而极其难以复现。\n* 两种经典的修复方式：把写操作汇集到一条**串行队列**中，或者使用**带 `.barrier` 的并发队列**（读者-写者模式）。\n* 什么是**死锁**，以及那个能让 app 永远冻结的单行错误。\n* 什么是**优先级反转**，用平实的话来说。\n* 一份无需运行任何代码就能推理线程安全的检查清单。\n\n当你准备好了，翻到下一页，我们会故意弄坏一家银行的共享余额。\n\n第 1 / 9 页  |  [下一页: Data Race](@next)";
