在Java中的静态块中创建线程时导致死锁

时间:2011-12-22 22:21:40

标签: java multithreading deadlock

我只是想在Java中的static块中创建一个线程,导致发生死锁。代码段如下。

package deadlock;

final public class Main
{
    static int value;

    static
    {
        final Thread t = new Thread()
        {
            @Override
            public void run()
            {
                value = 1;
            }
        };

        t.start();
        System.out.println("Deadlock detected");

        try
        {
            t.join();
        }
        catch (InterruptedException e)
        {
            System.out.println(e.getMessage());
        }
        System.out.println("Released");
    }

    public static void main(String...args)
    {
        //Java stuff goes here.
    }
}

它只是在控制台上显示检测到死锁并挂起。我想发生死锁的原因可能是在调用static方法之前首先加载了main()块。你能在上面的代码片段中看到死锁的确切原因吗?

3 个答案:

答案 0 :(得分:5)

为了使线程能够设置静态值,必须加载该类。为了加载类,线程必须结束(以便静态块完成)。这可能就是你陷入僵局的原因。

答案 1 :(得分:1)

如果你发表评论

    try
    {
        t.join();
    }
    catch (InterruptedException e)
    {
        System.out.println(e.getMessage());
    }

不会发生死锁...你的线程将在类加载后运行。

答案 2 :(得分:0)

从技术上讲,你不要把它称为死锁。 “死锁”意味着存在某种类型的监视器争用。

您正在做的事与调用

具有相同的效果
synchronized (Main.class) {
    try {
        Main.class.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

作为主要方法中的第一件事。您处于等待状态,您永远不会被唤醒。