理解我的Java死锁示例

理解我的Java死锁示例,java,multithreading,deadlock,Java,Multithreading,Deadlock,我自己也在尝试用java实现死锁。线程t1和t2以相同的顺序锁定s1和s2,从而导致死锁。但是,如果我注释掉调用thread类的sleep方法的Line1和Line2,则不会发生死锁。我运行该程序15次以上,但删除第1行和第2行不会导致死锁 所以我的问题是,第1行和第2行(调用Thread.sleep)是否是死锁所必需的。如果是,那么我还没有理解死锁。如果不是,它会在其他JVM上导致死锁吗 //Thread DeadLock class Threadlock { private final

我自己也在尝试用java实现死锁。线程t1和t2以相同的顺序锁定s1和s2,从而导致死锁。但是,如果我注释掉调用thread类的sleep方法的Line1和Line2,则不会发生死锁。我运行该程序15次以上,但删除第1行和第2行不会导致死锁

所以我的问题是,第1行和第2行(调用Thread.sleep)是否是死锁所必需的。如果是,那么我还没有理解死锁。如果不是,它会在其他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,您提供的代码都是格式错误的。在您的案例中,休眠似乎使死锁更加明显,但无论您是否等待一段时间,死锁都存在。

关键是:您对底层实现没有太多控制权。意思是:尽管您创建了两个线程并“按顺序”启动它们;事实上,JVM/OS很可能。。。开始t1;运行它;然后开始t2

为了增加你陷入死锁的机会;让你的方法至少持续几秒钟


换句话说,“陷入死锁”是一个函数,它取决于方法的实际运行时间和底层实现的细节

当某些线程同时需要相同的锁时,可能会发生死锁。在您的情况下,正如答案所说,同步块什么都不做——它们几乎不需要“任何时间”。阅读,它可以帮助您更好地理解该机制。如果您评论第1行和第2行,在其他程序的帮助下连续运行您的程序,我相信您将理解eod造成的死锁。一个注释认为:您希望其他人花时间帮助您;因此,请花1分钟的时间来正确格式化/插入所有输入。但还是被选上了…Upps。对的如果第一个进入关键区域并停留在那里,这不是死锁;而另一个没有到达那里。好吧,是另一种死锁。无论如何我去掉了那部分。谢谢你的意见!