Я столкнулся с тупиковым сценарием, который можно обобщить как класс StaticDeadlock, показанный ниже.
Эта простая программа остановится на o.getClass () . Вот мое предположение о том, что произошло, но кто-то может объяснить это лучше?
1) программа входит в статический блок StaticDeadlock
2) Тема Запускается
3) основной поток находится в ожидании завершения потока , следовательно, не может завершить статический блок
4) внутри поток доступ к StaticDeadlock.o , но статический блок StaticDeadlock еще не завершен. Значит программа зависает?
public class StaticDeadlock
{
private static final Object o = new Object();
static {
MyThread thread = new MyThread();
thread.start();
try {
thread.join();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main (String[] args)
{
System.out.println("all is well.");
}
static class MyThread extends Thread
{
@Override
public void run ()
{
System.out.println("inside mythread");
o.getClass();
}
}
}