/* Page prose (zh-Hans) */
"BlockingWithSync" = "# `sync`: 阻塞直到它完成\n\n`async` 的反面是 **`sync`**。它提交闭包，然后**阻塞调用它的线程**，直到那个闭包完成。在工作完成之前，控制权不会回到你手上。";
"BlockingWithSync-2" = "**观察运行：**这一次你得到干净的 `1️⃣ 2️⃣ 3️⃣`。`sync` 调用把主线程停在原地，直到代码块完成，所以 `3️⃣` 只能等 `2️⃣` 打印之后才打印。注意，你在这里什么都没得到：你把工作移到了后台队列，但接着又在主线程上*等待*它。反正主线程自始至终都被阻塞着。\n\n这就是关键的一课：**在主线程之外使用 `sync` 几乎不会给你带来任何好处**，因为把工作移出主线程的意义就在于*不去*等待它。你几乎总是想要 `async`。\n\n`sync` 有一些狭窄而刻意的用途（比如从一个守护共享状态的串行队列里短暂地读取一个值）；用它来“运行后台工作”通常是个错误。\n\n* callout(危险): 永远不要从主线程调用 `DispatchQueue.main.sync { }`。主线程会阻塞着等待主队列，而主队列在主线程空闲之前无法运行这个代码块。它永远在等待自己。这就是**死锁**，它会把你的 app 彻底冻住。别去运行它；只要知道它存在就好。死锁会在[并发的陷阱](Concurrency%20Hazards.playgroundchapter/Overview)那一章里得到恰当的处理。\n\n[上一页](@previous)  |  第 4 / 9 页  |  [下一页: 串行 vs. 并发：顺序与重叠](@next)";
