【问题标题】:Deadlock caused while creating a Thread in a static block in Java在Java中的静态块中创建线程时导致死锁
【发布时间】:2011-12-23 17:15:34
【问题描述】:

我只是试图在 Java 中的 static 块中创建一个线程,导致死锁发生。代码sn-p如下。

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 块。在上面的代码sn -p中你能看出死锁的确切原因吗?

【问题讨论】:

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

标签: java multithreading deadlock


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果你注释掉

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-09
        • 2021-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多