了解我的死锁Java示例

时间:2017-02-26 12:54:26

标签: java multithreading deadlock

我试图在java中实现死锁。线程t1和t2以相同的顺序锁定s1和s2导致死锁情况。但是,如果我注释掉Line1和Line2调用线程类的sleep方法,死锁会没有发生。我运行这个程序超过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();
  }
 }

3 个答案:

答案 0 :(得分:6)

如果您取消睡眠,您的方法不会做任何事情。因此它们非常快,以至于两个线程同时进入其第一个同步块的概率非常低。但它仍然可能发生。

答案 1 :(得分:1)

重点是:您对底层实现没有太多控制权。含义:虽然您创建了两个线程并按顺序启动它们#34;实际上JVM / OS很可能会发生...从t1开始;跑吧然后开始t2。

为了增加陷入死锁的机会;保持你的方法做事至少几秒钟!

换句话说:"陷入僵局"是一个函数,它取决于方法的实际运行时底层实现的详细信息。

答案 2 :(得分:0)

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