我在Stack Overflow上找到了一段代码,我认为它与我遇到的问题非常相似,但我仍然不明白为什么会进入死锁。这个例子来自于Java中的死锁检测:
Class A
{
synchronized void methodA(B b)
{
b.last();
}
synchronized void last()
{
System.out.println(“ Inside A.last()”);
}
}
Class B
{
synchronized void methodB(A a)
{
a.last();
}
synchronized void last()
{
System.out.println(“ Inside B.last()”);
}
}
Class Deadlock implements Runnable
{
A a = new A();
B b = new B();
// Constructor
Deadlock()
{
Thread t = new Thread(this);
t.start();
a.methodA(b);
}
public void run()
{
b.methodB(a);
}
public static void main(String args[] )
{
new Deadlock();
}
}
在这种情况下,当调用Deadlock()构造函数时,它会作为线程启动。此时将调用run()方法。它将调用b.methodB(a),然后调用a.last()只打印一条语句。同时,a.methodA(b)会调用b.last()。没有任何对象的交叉依赖,并且它们也不会同时执行一个方法。即使它们同时执行,使用synchronized关键字也会将它们排队,不是吗?但是为什么有时候会进入死锁呢?并非每次都会发生死锁,这相当难以预测。是什么导致它进入死锁,有哪些解决方法?