これはJava thread dump: BLOCKED thread without "waiting to lock ..." に似ています。
基本的に、ブロックされたスレッドが表示されますが、待機中のロックがあります。
"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)
...
- waiting to lock <0x0000000742444ad0>...の代わりに が表示されることを期待しています- locked...。もう 1 つの質問は、ガベージ コレクションが原因であることを示唆していますが、その場合、すべてのスレッドがブロックされるわけではありませんか? RUNNABLE である他のスレッドがあります。また、それが事実であったことをどのように証明できますか?なぜこれが観察された動作になるのでしょうか? それがガベージコレクターであると盲目的に考えて、数日後にそれが別のものであることが判明するのは嫌です。
==補助情報==
当面の問題とは関係ないと思いますが、これは上記のダンプの元となったコードのセクションです。
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;
}
}
}
明らかに、その行で取得する必要があるロックがあります。ただし、このモニターでスレッドが実際にブロックされている場合、スレッド ダンプの出力は次のようになります (これは同じダンプからのものです)。
"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)
...
私が興味を持っているダンプのセクションは異なって見えます (「ロック待ち」ではなく「ロック済み」)。多くのデッドロックをデバッグし、多くのスレッド ダンプを調べました。私がいつも目にするのは、「ロック待ち」です。「ロックされている」が「モニターのエントリを待機している」スレッドを見たことがなく、それが何を意味するのか知りたいです。