/* Page prose (ja) */
"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 { }` を決して呼ばないでください。メインスレッドはメインキューを待ってブロックしますが、メインキューはメインスレッドが空くまでブロックを実行できません。永遠に自分自身を待ちます。これが**デッドロック**で、アプリを完全にフリーズさせます。実行はせず、存在することだけ知っておいてください。デッドロックは [並行処理の落とし穴](Concurrency%20Hazards.playgroundchapter/Overview) の章できちんと扱います。\n\n[前へ](@previous)  |  4 / 9 ページ  |  [次へ: シリアル vs. 並行: 順序と重なり](@next)";
