Потоки Java, ожидающие блокировки объекта, который (видимо) не заблокирован - PullRequest
6 голосов
/ 13 ноября 2010

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

В этом случае у меня есть много потоков, ожидающих монитор (0x965ad100), но ни у одного, кажется, нет такого монитора.Рассматриваемые потоки могут быть идентифицированы с помощью этой подписи:

в ожидании блокировки <0x965ad100> (a uk.gov.dti.og.fox.ConAgent)

IЯ пытался найти это в Google, и все, что мне кажется, это сообщения, в которых обсуждаются заблокированные мониторы, ничего об ожидании не заблокированного монитора.

Полный дамп потока: http://www.basson.at/docs/stackoverflow/thread_dump.txt

Я надеюсь, что кто-то здесь сможет объяснить, что я вижу, или, по крайней мере, указать мне правильное направление.Заранее спасибо за любые ответы.

Ответы [ 2 ]

1 голос
/ 14 ноября 2010

Если вы используете Eclipse, вы можете использовать встроенный просмотрщик блокировок через представление отладки, что может быть полезно.Вы можете включить его с помощью выпадающего меню, доступного через стрелку вниз на панели инструментов:)

alt text

1 голос
/ 14 ноября 2010

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

Скорее всего, где-то есть поток, который уже содержит монитор.Иногда это не очевидно.У ваших трассировок стека есть несколько «заблокированных» строк, в которых перечислены потоки, которые содержат определенные блокировки, но этот список не обязательно завершен.Например, я подозреваю, что блокировки, полученные с помощью JNI, не перечислены.

Если вы могли бы заменить встроенную блокировку, например, java.util.concurrent.locks.ReentrantLock, то вы можете приостановить программу и присоединить отладчик, найти блокировку.вы заботитесь о владельце блокировки и используете метод getOwner.

...