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.

questionAnswers(2)

yourAnswerToTheQuestion