2015-11-17 3 views
-1

Я знаю, что только один поток получит блокировку монитора. Но что будет со всеми остальными ждать() потоков нитей на низком уровне? (Поскольку все они уведомлены) Будут ли все просыпаться и войти в какой-то дорогой спин-замок? Или они снова вернутся к блокировке на замке? Ищете сведения о низком уровне - особенно, пытаясь понять, будет ли в результате этого потреблять процессор?Что происходит с notifyAll()?

Также, когда нить ждет на мониторе, является ли фактическая потоки операционной системы удалены из нее за кулисами? (Чтобы поток ОС мог использоваться для полезной работы)

+0

Что говорит джавадок? –

+0

, как говорится в названии: 'notifyAll()' будет уведомлять (просыпаться) все потоки, которые ждали (с 'wait()') на конкретном объекте! Все потоки выполняют следующую строку после 'wait()' – ParkerHalo

+0

. Я бы сказал, что, если бы кто-либо из них имел значение в вашем прецеденте (с точки зрения производительности), вы бы знали подробности. В документации рекомендуется использовать 'notifyAll()', поэтому я предлагаю вам пойти с этим и перестать беспокоиться о вашем процессоре. – Kayaman

ответ

1

Ответы на связанный вопрос не касаются этих вопросов конкретно.

Потоки, которые уведомляются с уведомлением. Проснутся, затем они попытаются получить блокировку, в которую они были заблокированы, ожидая (вместе с любыми новыми потоками, которые хотят приобрести блокировку). Планировщик выбирает победителя, а проигравшие снова возвращаются к блокировке.

Поток ОС не переназначается от объекта потока Java, блоков потока уровня ОС. Вы можете подтвердить это, просмотрев потоки в инструменте мониторинга производительности. Планирование и блокировка происходят на уровне ОС (за исключением зеленых потоков, где потоки моделируются JVM).

+0

[Спасибо. (Да, связанный вопрос не отвечает на мой вопрос вообще - я уже отправился на поиски ответа, прежде чем опубликовал его). ] –

Смежные вопросы