我是新来的线程,并提出了一个死锁的例子。 我试图重现死锁方案,但代码正常工作没有任何问题。死锁的线程java
请指导我在哪里错了。 下面的代码片段
package Practice;
public class Deadlock {
public static void main(String[] args) {
Deadlock a = new Deadlock();
Threadslock first = new Threadslock(a);
Threadslock second = new Threadslock(a);
first.setName("First");
second.setName("Second");
first.start();
second.start();
}
}
class Threadslock extends Thread
{
Deadlock lock ;
private String anotherLock = "";
Threadslock(Deadlock lo)
{
lock = lo;
}
public void run()
{
if(getName().equals("First"))
{
synchronized(lock)
{
synchronized(anotherLock)
{
try
{
Thread.sleep (2000);
}
catch(InterruptedException r)
{
}
System.out.println("First Thread");
System.out.println("Next Step in First");
}
}
}
else
{
synchronized(anotherLock)
{
synchronized(lock)
{
try{
Thread.sleep (2000);
}
catch(Exception e)
{
}
System.out.println("Second Thread");
System.out.println("Next Step in Second");
}
}
}
}
}
输出是这样的:
第一线
在第一
第二个线程下一步
在二
获取死锁的“窍门”是锁定交错,因此您应该在两个同步块之间睡眠,而不是在两者之间。 –
不是答案,但是,如果您使用两个不同的Runnable实例来实现两个不同的线程行为,而不是一个具有大if语句的run()方法,那么您的代码(和习惯)将更加面向对象决定要执行哪个行为。 –
@jameslarge感谢您提供的行为..我只是检查是否在上述情况下是可能的死锁 –