Fadenabwurf gesperrt UND gesperrt

Das ist ähnlich wieJava Thread Dump: BLOCKED Thread ohne "Warte auf Sperre ...".

Grundsätzlich sehe ich einen BLOCKED-Thread, aber er hat die Sperre, auf die er wartet:

"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)
        ...

Ich würde erwarten zu sehen- waiting to lock <0x0000000742444ad0>... anstatt- locked.... Die andere Frage deutet darauf hin, dass die Garbage Collection die Ursache ist. Wenn dies der Fall wäre, würden dann nicht alle Threads BLOCKIERT sein? Es gibt andere Threads, die RUNNABLE sind. Wie konnte ich auch beweisen, dass dies der Fall war? Warum sollte dies das beobachtete Verhalten sein? Ich möchte nicht blindlings davon ausgehen, dass es der Müllsammler ist, nur um Tage später herauszufinden, dass es etwas anderes war.

== Zusatzinfo ==

Obwohl ich es für das vorliegende Problem nicht relevant halte, ist dies der Codeabschnitt, aus dem der obige Speicherauszug stammt.

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;
}
  }
}

Es ist klar, dass für diese Leitung eine Sperre erforderlich ist. Wenn jedoch ein Thread auf diesem Monitor wirklich blockiert ist, sieht die Ausgabe im Thread-Dump wie folgt aus (dies kommt aus demselben 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)
        ...

Der Abschnitt des Dumps, der mich interessiert, sieht anders aus ("gesperrt" statt "Warten auf Sperren"). Ich habe viele Deadlocks behoben und mir viele Thread-Dumps angesehen. Was ich immer sehe, ist das "Warten auf Sperre". Ich habe noch nie einen Thread gesehen, der "gesperrt" ist, aber immer noch "auf Monitoreintrag wartet", und ich möchte wissen, was das bedeutet.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage