Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中的静态块中创建线程时导致死锁_Java_Multithreading_Deadlock - Fatal编程技术网

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

在Java中的静态块中创建线程时导致死锁,java,multithreading,deadlock,Java,Multithreading,Deadlock,我只是试图在Java中的静态块中创建一个导致死锁发生的线程。代码片段如下所示 package deadlock; final public class Main { static int value; static { final Thread t = new Thread() { @Override public void run() {

我只是试图在Java中的
静态
块中创建一个导致死锁发生的线程。代码片段如下所示

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.
    }
}


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

为了让线程能够设置静态值,必须加载类。为了加载类,线程必须结束(以便静态块完成)。这可能就是死锁的原因。

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

如果你不加评论的话

    try
    {
        t.join();
    }
    catch (InterruptedException e)
    {
        System.out.println(e.getMessage());
    }
死锁不会发生…您的线程将在类加载后运行。

如果您注释掉

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

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

从技术上讲,您不会将其称为死锁。“死锁”意味着存在某种类型的监视器争用

你所做的和打电话的效果一样

synchronized (Main.class) {
    try {
        Main.class.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

作为主要方法的第一件事。您处于等待状态,从未被唤醒。

从技术上讲,这并不是死锁。“死锁”意味着存在某种类型的监视器争用

你所做的和打电话的效果一样

synchronized (Main.class) {
    try {
        Main.class.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

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

是的,
static
块在
main()
之前执行。
static
块在
main()
之前执行。