我遇到了一个死锁情况,可以将其概括为以下所示的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值的操作都会使第二个线程等待类初始化完成,这当然不会发生,因为第一个线程正在等待第二个线程结束。

10-07 13:20