Зависит ли Java от потоков, занимающих больше ресурсов ЦП?

Я хотел бы спросить, будет ли Java использовать больше ресурсов ЦП при блокировании потоков, т.е. ожидать блокировки монитора, который в настоящее время заблокирован другим потоком.

Теперь я смотрю на дамп потока, когда некоторые потоки блокируются, так как они ждут блокировки монитора, и я не уверен, что это то, что может быть подотчетно за высокую загрузку процессора.

Спасибо!

EDIT (6 мая 2011 г.) Я забыл упомянуть, относится ли это поведение к Java SE 1.4.2.

Ответ 1

Нити потребляют ресурсы, такие как память. Блокирующая/разблокирующая нить несет однократную стоимость. Если поток блокирует/разблокирует десятки тысяч раз в секунду, это может растрачивать значительные объемы процессора.

Однако, как только поток заблокирован, не имеет значения, сколько времени он заблокирован, нет текущих затрат.

Ответ 2

Ответ не так прост. Могут быть случаи, когда потоки, которые попадают в заблокированное состояние, могут привести к загрузке процессора.

В большинстве JVM используются многоуровневые алгоритмы блокировки. Часто включают такие алгоритмы, как шпиндельные блоки, особенно для замков, которые удерживаются на короткое время. Когда нить пытается получить монитор и считает, что он не может, JVM может фактически поставить его в цикле и попытаться попытаться попытаться использовать монитор, а не переключать контекст немедленно. Если нить не может получить блокировку после определенного количества попыток или длительности (в зависимости от конкретной реализации JVM), JVM переключается на режим "блокировки жира" или "надутый замок", в котором контекст отключает поток.

Это связано с поведением спин-блокировки, когда вы можете нести затраты на процессор. Если у вас есть код, который содержит блокировку в течение очень короткой продолжительности, и конкуренция высока, то вы можете увидеть заметный бамп в использовании ЦП. Для некоторых обсуждений по различным методикам, которые используют JVM для сокращения затрат на конкуренцию, см. http://www.ibm.com/developerworks/java/library/j-jtp10185/index.html.

Ответ 3

Нет, потоки, заблокированные на мониторе, не занимают дополнительного времени процессора.

Ответ 4

Приостановленный или заблокированный поток не потребляет процессорного времени.