/* Page prose (ja) */
"Deadlock" = "# デッドロック: 永遠に自分自身を待つ\n\n**デッドロック** とは、タスクが円環状に互いを待ち合い、誰も動けなくなって作業が永久に止まることです。もっとも単純な形は、キュー一つと単語一つだけで足ります。`sync` です。\n\n`sync` が *「このブロックを実行し、それが終わるまで戻らない」* を意味することを思い出してください。では、古典的な凍結です。メインスレッド上で実行しながら、メインキューに `sync` します:\n\n```swift\n// ⚠️ DO NOT RUN THIS: it deadlocks the main thread forever.\nimport Foundation\n\nDispatchQueue.main.sync {\n    print(\"This line never runs.\")\n}\n```\n\nロジックをたどりましょう:\n\n1. あなたはメインスレッド上にいます。`main.sync { ... }` を呼びます。\n2. `sync` はこう言います。「そのブロックが終わるまで、ここでずっと待ちます。」\n3. しかしそのブロックは **メインキュー** で実行されるようスケジュールされています。それはまさに、いま `sync` の中で凍りついて待っているスレッドです。\n4. メインスレッドはブロックを待ち、ブロックはメインスレッドが空くまで始められません。どちらも決して譲りません。**凍結です。**\n\nこれは参加者が一人だけの循環待機です。同じ罠は、**すでに自分が実行しているシリアルキュー** に `sync` するときにいつでも発動します:\n\n```swift\n// ⚠️ DO NOT RUN THIS EITHER: same deadlock, different disguise.\nimport Foundation\n\nlet ledger = DispatchQueue(label: \"ledger\")   // serial\n\nledger.sync {\n    // We are now running *on* ledger...\n    ledger.sync {          // ...and we ask it to run something and wait.\n        print(\"Unreachable.\")   // ledger is busy with us. Circular wait.\n    }\n}\n```\n\n競合のある例はライブで実行しました。間違った数値は無害だからです。これらは実行**しません**。デッドロックは何も出力せず、手動で止めるまで Playground のページをただハングさせるだけだからです。だからこそ、この規則は覚えておく価値があります:\n\n**すでに自分がいるキューを対象に `sync` を呼んではいけません。とりわけ、メインスレッドから `DispatchQueue.main.sync` を呼んではいけません。**\n\n`async` にはこの問題がありません。ブロックを渡してすぐに戻るので、立って待っている人が誰もいないのです。UI を更新するためにメインキューに戻る必要があるときは、つねに `DispatchQueue.main.async` です。\n\n[前へ](@previous)  |  6 / 9 ページ  |  [次へ: 優先度逆転](@next)";
