[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-v-chem-raznitsa-mezhdu-notify-i-notifyall":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":20,"progress":21,"seo":22},245,"v-chem-raznitsa-mezhdu-notify-i-notifyall",8,"mnogopotochnost","Многопоточность","🔀","В чем разница между notify() и notifyAll()?","Метод `notify()` пробуждает один произвольный поток из wait set монитора, а `notifyAll()` пробуждает все ожидающие потоки. Выбор пробуждаемого потока при `notify()` не определён спецификацией и зависит от реализации JVM.\n\n### Сравнение\n\n| Критерий | `notify()` | `notifyAll()` |\n|---|---|---|\n| Количество пробуждённых потоков | Один (произвольный) | Все |\n| Какой именно поток | Не определено (зависит от JVM) | Все, но монитор захватит только один |\n| Риск потери сигнала | Да — может разбудить «не тот» поток | Нет — все потоки проверят условие |\n| Производительность | Выше (меньше переключений контекста) | Ниже при большом числе ожидающих |\n\n### Проблема потери сигнала с notify()\n\nЕсли несколько потоков ждут на одном мониторе, но с разными условиями, `notify()` может пробудить поток, для которого условие всё ещё не выполнено:\n\n\u003Cdetails>\n\u003Csummary>Пример потери сигнала\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Поток A ждёт: while (!dataReady) lock.wait();\n\u002F\u002F Поток B ждёт: while (!spaceAvailable) lock.wait();\n\n\u002F\u002F Производитель вызывает notify() после записи данных\n\u002F\u002F JVM может разбудить поток B, а не A\n\u002F\u002F Поток B проверит spaceAvailable — оно false — снова wait()\n\u002F\u002F Сигнал потерян, поток A продолжает спать\n```\n\n\u003C\u002Fdetails>\n\n### Когда безопасно использовать notify()\n\n`notify()` безопасен только при одновременном выполнении двух условий:\n1. Все ожидающие потоки ждут одного и того же условия.\n2. Каждое уведомление актуально максимум для одного потока.\n\nВо всех остальных случаях используйте `notifyAll()`.\n\n### Вывод\n\nНа практике `notifyAll()` — более безопасный выбор. Используйте `notify()` только при уверенности, что условие ожидания одинаково для всех потоков в wait set. Для более гибкого управления используйте `Condition` из `ReentrantLock`, который позволяет создавать отдельные очереди ожидания для разных условий.\n\n> **На собеседовании:** объясните проблему потери сигнала (lost notification) и когда `notify()` безопасен. Это показывает глубокое понимание механизма.","","middle",[15,16,17,18,19],"isInterrupted","interrupted","прерывание","Thread","concurrency",[],null,{"title":23,"description":24,"ogTitle":25,"ogDescription":26,"keywords":27,"schemaAnswer":32,"featuredSnippetReady":33},"interrupted() vs isInterrupted() в Java — Gymterview","Thread.interrupted() — статический, проверяет текущий поток и сбрасывает флаг. isInterrupted() — нестатический, проверяет другой поток без сброса флага.","interrupted() vs isInterrupted() — сброс флага или нет","Thread.interrupted() — статический, сбрасывает флаг прерывания. isInterrupted() — нестатический, не сбрасывает. Оба проверяют статус прерывания.",[28,29,30,31],"interrupted vs isInterrupted Java","Thread.interrupted Java","isInterrupted Java","флаг прерывания потока","Thread.interrupted() — статический метод, проверяет текущий поток и сбрасывает флаг прерывания. isInterrupted() — нестатический, проверяет статус прерывания другого потока без изменения флага.",true]