我试图在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();
}
}
答案 0 :(得分:6)
如果您取消睡眠,您的方法不会做任何事情。因此它们非常快,以至于两个线程同时进入其第一个同步块的概率非常低。但它仍然可能发生。
答案 1 :(得分:1)
重点是:您对底层实现没有太多控制权。含义:虽然您创建了两个线程并按顺序启动它们#34;实际上JVM / OS很可能会发生...从t1开始;跑吧然后开始t2。
为了增加陷入死锁的机会;保持你的方法做事至少几秒钟!
换句话说:"陷入僵局"是一个函数,它取决于方法的实际运行时和底层实现的详细信息。
答案 2 :(得分:0)
并行程序本质上是不确定的。实际上,当您执行错误的程序时,可能会或可能不会观察到潜在的死锁。您提供的代码在使用和不调用Thread.sleep时都是格式错误的。在您的情况下,睡眠似乎使死锁更加明显,但无论您是否等待一段时间,它都在那里。