我遇到了一个死锁情况,可以将其概括为以下所示的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();
}
}
}
最佳答案
是的,仅此而已。在访问静态成员之前,新线程正在等待StaticDeadlock
的类初始化程序完成。有关更多详细信息,请参见section 12.4.2 of the Java Language Specification,尤其是以下步骤:
它甚至不会超过第二个线程中的第1步,因为第一个线程具有锁并且不会释放它。
请注意,它不是在调用导致问题的getClass()
-做任何需要o
值的操作都会使第二个线程等待类初始化完成,这当然不会发生,因为第一个线程正在等待第二个线程结束。