[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-chto-takoe-deadlock":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},244,"chto-takoe-deadlock",8,"mnogopotochnost","Многопоточность","🔀","Что такое deadlock?","Взаимная блокировка (deadlock) — это ситуация, при которой два или более потоков навечно заблокированы, ожидая друг от друга освобождения ресурсов, которые они удерживают.\n\n> Аналогия из жизни: два автомобиля встретились на узком мосту, каждый ждёт, пока другой уступит дорогу. Ни один не может двигаться — оба стоят навсегда.\n\n### Условия возникновения (условия Коффмана)\n\nDeadlock возникает при одновременном выполнении всех четырёх условий:\n\n| Условие | Описание |\n|---|---|\n| **Mutual exclusion** (взаимное исключение) | Хотя бы один ресурс используется в режиме эксклюзивного доступа |\n| **Hold and wait** (удержание и ожидание) | Поток удерживает ресурс и запрашивает дополнительный, удерживаемый другим потоком |\n| **No preemption** (отсутствие принудительного освобождения) | Ресурс не может быть принудительно отобран у потока — только добровольное освобождение |\n| **Circular wait** (циклическое ожидание) | Существует замкнутая цепочка потоков, каждый из которых ждёт ресурс, удерживаемый следующим |\n\n### Пример deadlock\n\n\u003Cdetails>\n\u003Csummary>Код, приводящий к deadlock\u003C\u002Fsummary>\n\n```java\nfinal Object lockA = new Object();\nfinal Object lockB = new Object();\n\n\u002F\u002F Поток 1: захватывает A, потом B\nnew Thread(() -> {\n    synchronized (lockA) {\n        try { Thread.sleep(100); } catch (InterruptedException e) { }\n        synchronized (lockB) {\n            System.out.println(\"Поток 1: захватил A и B\");\n        }\n    }\n}).start();\n\n\u002F\u002F Поток 2: захватывает B, потом A — обратный порядок!\nnew Thread(() -> {\n    synchronized (lockB) {\n        try { Thread.sleep(100); } catch (InterruptedException e) { }\n        synchronized (lockA) {\n            System.out.println(\"Поток 2: захватил B и A\");\n        }\n    }\n}).start();\n\u002F\u002F Результат: deadlock — оба потока ждут друг друга бесконечно\n```\n\n\u003C\u002Fdetails>\n\n### Способы предотвращения\n\nДостаточно нарушить любое из четырёх условий Коффмана:\n\n- **Упорядочивание блокировок**: всегда захватывать блокировки в одном и том же порядке и освобождать в обратном.\n- **Использование `tryLock(timeout)`**: `ReentrantLock.tryLock()` позволяет задать таймаут и отступить при неудаче, вместо бесконечного ожидания.\n- **Минимизация критических секций**: чем меньше кода под блокировкой, тем меньше шанс deadlock.\n- **Lock-free алгоритмы**: использование `Atomic*`-переменных и concurrent-коллекций вместо явных блокировок.\n\n### Способы диагностики\n\n- `jstack \u003CPID>` — показывает дамп потоков с обнаруженными deadlock.\n- `jcmd \u003CPID> Thread.print` — аналогично jstack.\n- JMX: `ThreadMXBean.findDeadlockedThreads()` — программная проверка.\n- IDE: IntelliJ IDEA, VisualVM — визуальная диагностика потоков.\n\n\u003Cdetails>\n\u003Csummary>Программное обнаружение deadlock\u003C\u002Fsummary>\n\n```java\nThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();\nlong[] deadlockedThreads = threadMXBean.findDeadlockedThreads();\n\nif (deadlockedThreads != null) {\n    ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(deadlockedThreads, true, true);\n    for (ThreadInfo info : threadInfos) {\n        System.out.println(\"Deadlocked thread: \" + info.getThreadName());\n        System.out.println(\"  Waiting for: \" + info.getLockName());\n        System.out.println(\"  Held by: \" + info.getLockOwnerName());\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Вывод\n\nDeadlock — одна из самых опасных проблем многопоточности, потому что программа зависает без какого-либо исключения или сообщения об ошибке. Ключевая стратегия предотвращения — строгий порядок захвата блокировок и использование `tryLock` с таймаутом.\n\n> **На собеседовании:** перечислите четыре условия Коффмана, приведите пример кода с deadlock и способ его исправления (упорядочивание блокировок). Бонус — покажите, как программно обнаружить deadlock через `ThreadMXBean`.","","junior",[],[],null,{"title":18,"description":19,"ogTitle":20,"ogDescription":21,"keywords":22,"schemaAnswer":12,"featuredSnippetReady":28},"Что такое deadlock? — Многопоточность | Gymterview","Ответ на вопрос: Что такое deadlock? Подготовка к собеседованию Java Developer — тема Многопоточность.","Что такое deadlock? — Gymterview","Разбор понятия deadlock (взаимная блокировка) для собеседования Java Developer.",[23,24,25,26,27],"deadlock","взаимная блокировка","тупик","многопоточность","Java собеседование",false]