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