了解 Java 的死锁示例

Understanding my Deadlock Example of Java

我试图在 java myself.Both 中实现死锁,如果我注释掉 Line1 和Line2 调用线程class的sleep 方法,死锁不会occur.I 运行 这个程序超过15 次但是删除第1 行和第2 行不会导致死锁。

所以我的问题是,第1行和第2行(调用Thread.sleep)是否对deadlock.If是必要的,那么我还没有理解deadlock.If不,它会导致死锁吗其他一些 JVM?

//Thread DeadLock

class Threadlock 
{
 private final static  String s1="java";
 private final  static String s2="deadlock";
 public static void main(String[] args)
 {  
  Thread t1= new Thread()
  {
     public void run()
     {
      synchronized(s1)
      {
       try { Thread.sleep(100);} 
       catch (Exception e) {}  //Line 1
       synchronized(s2)
       {}
      }
     }
  };

  Thread t2= new Thread()
  {
     public void run()
     {
      synchronized(s2)
      {
        try { Thread.sleep(100);} catch (Exception e) {}  //Line 2
        synchronized(s1)
        {}
      }
     }
  };

  t2.start();
  t1.start();
  }
 }

如果您删除睡眠,您的方法将不会执行任何操作。所以他们是如此之快以至于两个线程同时进入他们的第一个同步块的概率非常非常低。不过,它仍然可能发生。

并发程序本质上是不确定的。实际上,当您执行错误的程序时,可能会或可能不会观察到潜在的死锁。您提供的代码在调用和不调用 Thread.sleep 时格式错误。在您的情况下,睡眠似乎使死锁更加明显,但无论您是否等待一段时间,它都存在。

重点是:您对底层实现没有太多控制权。意思是:虽然你创建了两个线程并启动了它们"in sequence";现实中的 JVM/OS 很可能发生......开始 t1;运行它;然后开始 t2.

为了增加运行进入死锁的机会;让你的方法至少做几秒钟!

换句话说:"running into a deadlock" 是一个函数,它取决于您的方法的实际运行时间 底层实现的细节。