Dump de thread bloqueado e bloqueado
Isso é semelhante aDesvio de encadeamento Java: encadeamento BLOCKED sem "aguardar bloqueio ...".
Basicamente, estou vendo um thread BLOCKED mas ele tem o bloqueio que está esperando:
"pool-1-thread-60" prio=10 tid=0x00007fbf10017000 nid=0x210 waiting for monitor entry [0x00007fbed64e3000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.log4j.Category.callAppenders(Category.java:204)
- locked <0x0000000742444ad0> (a org.apache.log4j.Logger)
at org.apache.log4j.Category.forcedLog(Category.java:391)
at org.apache.log4j.Category.info(Category.java:666)
...
Eu esperaria ver- waiting to lock <0x0000000742444ad0>...
ao invés de- locked...
. A outra pergunta sugere que a coleta de lixo é a causa, mas se esse fosse o caso, todos os threads não seriam BLOQUEADOS? Existem outros tópicos que são RUNNABLE. Além disso, como eu poderia provar que era o caso? Por que isso seria o comportamento observado? Eu não quero ir cegamente supondo que é o coletor de lixo só para descobrir dias depois que era outra coisa.
== Informação auxiliar ==
Embora eu não ache relevante para o problema em questão, esta é a seção de código da qual o despejo acima veio.
for(Category c = this; c != null; c=c.parent) {
// Protected against simultaneous call to addAppender, removeAppender,...
synchronized(c) { //line 204
if(c.aai != null) {
writes += c.aai.appendLoopOnAppenders(event);
}
if(!c.additive) {
break;
}
}
}
Claramente, há um bloqueio que precisa ser obtido nessa linha. NO ENTANTO, quando um encadeamento é realmente bloqueado neste monitor, a saída no dump do encadeamento aparece como (isso vem do mesmo dump):
"pool-1-thread-44" prio=10 tid=0x00007fbef0051000 nid=0x200 waiting for monitor\
entry [0x00007fbed74f3000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.log4j.Category.callAppenders(Category.java:204)
- waiting to lock <0x0000000742444ad0> (a org.apache.log4j.Logger)
at org.apache.log4j.Category.forcedLog(Category.java:391)
at org.apache.log4j.Category.info(Category.java:666)
...
A seção do despejo em que estou interessado parece diferente ("bloqueada" em vez de "aguardando para bloquear"). Eu depurei muitos deadlocks e observei muitos lances de thread. O que eu sempre vejo é o "esperando para bloquear". Eu nunca vi um thread que está "bloqueado", mas ainda "aguardando entrada do monitor" e eu quero saber o que isso significa.