プログラムがハングし、デッドロックのように見える状況に遭遇しました。しかし、jconsoleとvisualvmを使用してそれを理解しようとしましたが、デッドロックは検出されませんでした。サンプルコード:
public class StaticInitializer {
private static int state = 10;
static {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
state = 11;
System.out.println("Exit Thread");
}
});
t1.start();
try {
t1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("exiting static block");
}
public static void main(String...strings) {
System.out.println(state);
}
}
これをデバッグモードで実行すると、コントロールが@Override public void run(){state = 11;
ただし、state = 11が実行されるとすぐに、ハング/デッドロックが発生します。私はstackoverflowのさまざまな投稿を調べ、静的初期化子はスレッドセーフだと思いましたが、その場合、jconsoleはこれを報告する必要があります。メインスレッドについて、jconsoleは待機状態にあると言っていますが、それで問題ありません。ただし、静的初期化子ブロックで作成されたスレッドの場合、jconsoleは、スレッドがRUNNABLE状態であり、ブロックされていないと言います。私は混乱していて、ここではいくつかの概念が欠けています。私を助けてください。