/* Page prose (de) */
"Deadlock" = "# Deadlock: für immer auf sich selbst warten\n\nEin **Deadlock** ist, wenn die Arbeit dauerhaft stoppt, weil Aufgaben im Kreis aufeinander warten und niemand sich bewegen kann. Die einfachste Version braucht nur eine Warteschlange und ein Wort: `sync`.\n\nErinnere dich, dass `sync` bedeutet: *\"führe diesen Block aus und kehre nicht zurück, bis er fertig ist.\"* Nun das klassische Einfrieren. Wir laufen auf dem Hauptthread und `sync`en auf die Hauptwarteschlange:\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\nGeh die Logik durch:\n\n1. Du bist auf dem Hauptthread. Du rufst `main.sync { ... }` auf.\n2. `sync` sagt: \"Ich warte genau hier, bis dieser Block fertig ist.\"\n3. Aber der Block ist so geplant, dass er auf der **Hauptwarteschlange** läuft, welche genau der Thread ist, der jetzt innerhalb von `sync` eingefroren wartet.\n4. Der Hauptthread wartet auf den Block; der Block kann nicht starten, bis der Hauptthread frei ist. Keiner gibt je nach. **Eingefroren.**\n\nDas ist ein zirkuläres Warten mit einem einzigen Teilnehmer. Dieselbe Falle schnappt zu, wann immer du auf **eine serielle Warteschlange `sync`st, auf der du bereits läufst**:\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\nDas Beispiel mit dem Race haben wir live ausgeführt, weil eine falsche Zahl harmlos ist. Diese hier führen wir **nicht** aus, weil ein Deadlock nichts ausgibt; er lässt die Playground-Seite einfach hängen, bis du sie von Hand stoppst. Genau das ist der Grund, warum die Regel es wert ist, sich einzuprägen:\n\n**Rufe `sync` niemals mit Ziel auf der Warteschlange auf, auf der du bereits bist. Insbesondere niemals `DispatchQueue.main.sync` vom Hauptthread.**\n\n`async` hat dieses Problem nicht: Es übergibt den Block und kehrt sofort zurück, sodass niemand herumsteht und wartet. Wenn du zur Hauptwarteschlange zurückspringen musst, um die UI zu aktualisieren, ist es immer `DispatchQueue.main.async`.\n\n[Zurück](@previous)  |  Seite 6 von 9  |  [Weiter: Prioritätsinversion](@next)";
