Я столкнулся с ситуацией, когда моя программа зависает, выглядит как тупик. Но я попытался выяснить это с помощью 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 и не заблокирован. Я сбит с толку, и здесь не хватает какой-то концепции. Пожалуйста, помогите мне.