Java нишки, чакащи да заключат обект, който не е (видимо) заключен

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

В този случай имам много нишки, които чакат монитор (0x965ad100), но никой не изглежда да има този монитор на първо място. Въпросните нишки могат да бъдат идентифицирани с този подпис:

изчакване за заключване ‹0x965ad100> (a uk.gov.dti.og.fox.ConAgent)

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

Пълен дъмп на темата: http://www.basson.at/docs/stackoverflow/thread_dump.txt

Надявам се някой тук да може да обясни какво виждам или поне да ме насочи в правилната посока. Благодаря предварително за всички отговори.


person Ben    schedule 13.11.2010    source източник
comment
Между другото, по-добре проверете какво прави Thread-9, защото чака същото заключване, което вече е придобил (0x96560c48)   -  person Grzegorz Oledzki    schedule 14.11.2010


Отговори (2)


Възможно е (макар и малко вероятно) нишка току-що да е освободила монитора, когато дъмпът на вашата нишка е бил взет. Може да има кратък период между освобождаването на монитора и получаването му от следващата нишка. Ако не сте в истинска задънена улица, това може да обясни какво виждате. Опитайте друга нишка и проверете тази.

По-вероятно там някъде има нишка, която вече държи монитора. Понякога не е очевидно. Вашите проследявания на стека имат някои „заключени“ редове, които изброяват нишки, които държат определени заключвания, но този списък не е непременно пълен. Например подозирам, че брави, получени чрез JNI, не са изброени.

Ако можете да смените вградената брава с напр. java.util.concurrent.locks.ReentrantLock, тогава можете да спрете програмата и да прикачите програма за отстраняване на грешки, да намерите ключалката, която ви интересува, и да намерите собственика на ключалката, като използвате метода getOwner.

person Keith Randall    schedule 13.11.2010

Ако използвате Eclipse, можете да използвате вградения преглед на заключване чрез изгледа за отстраняване на грешки, който може да бъде полезен. Можете да го активирате, като използвате падащото меню, достъпно чрез стрелката надолу в лентата с инструменти :)

алтернативен текст

person Chris Dennett    schedule 13.11.2010