/* Page prose (zh-Hans) */
"ReasoningAboutThreadSafety" = "# 如何推理线程安全\n\n一份你可以在脑子里运行的检查清单，在你按下 **Run** 之前：\n\n* **找出共享的可变状态。**  \n任何可以从多个任务同时到达的 `var`（一个属性、一个被捕获的变量、一个集合）。没有既共享*又*可变的状态，就没有 data race。（不可变的，或不共享的，自动就是安全的。）\n* **问一问谁在写。**  \n如果所有人都只读，你就没事。危险始于第一个并发的写入者。\n* **寻找先读后写的间隙。**  \n`x += 1`、“先检查再行动”、“读一个字典然后更新它”。任何先读取一个值、之后再基于它写入的操作，都有一个可以被另一个任务破坏的间隙。\n* **说出那个协调机制的名字。**  \n对每一份共享的可变状态，指出那*唯一*一个把访问串行化的东西：一条串行队列、一道屏障、一个信号量、（往后会讲的）一个 actor。如果你说不出它的名字，就假定它有竞争。\n* **优先把它藏起来。**  \n把状态和它的协调机制包进一个类型里（就像之前的 `Account`），这样调用者就无法碰到那个原始的值，也不会忘记加锁。\n\n在这里推理胜过运行，因为运行不可信：一个在你的编辑器里看不见的竞争，在别人更旧的 iPhone 上可能就是一次崩溃。\n\n[上一页](@previous)  |  第 8 / 9 页  |  [下一页: 小结](@next)";
