我试图在java中自己实现死锁。线程t1和t2都以相同的顺序锁定s1和s2,导致死锁情况。但是,如果我注释掉Line1和Line2调用睡眠方法的线程类,不会发生死锁。我运行该程序超过15次,但删除行1和行2不会导致死锁。了解我的死锁Java示例
所以我的查询是,行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();
}
}
当某些线程同时需要相同的锁时,可能会发生死锁。就你的情况而言,如答案所述,同步块无效 - 他们需要接近“没有时间”。阅读http://tutorials.jenkov.com/java-concurrency/deadlock.html,它可以帮助你更好地理解机制。 –
如果您对第1行和第2行进行注释,请在其他程序的帮助下持续运行您的程序,我相信您会通过eod了解死锁。 –
一个想法:你希望别人花时间帮助你;所以你请花1分钟时间来正确地格式化/全部输入。但仍然upvoted ... – GhostCat