我在理解此程序中的死锁情况概念时遇到了一些麻烦。 我得到的输出为: 进入一个方法 进入bmethod 然后发生死锁情况。 现在因为我的方法是一个同步方法,所以不应该先完全执行,即通过调用bsum方法然后启动新线程。 ? 请解释......
public class Deadlock
{
public static void main(String[] args)
{
A a= new A();
B b= new B();
new MainClass1(a,b);
new MainClass2(a,b);
}
}
class MainClass1 extends Thread
{
A a;
B b;
MainClass1(A a,B b)
{
super();
this.a=a;
this.b=b;
start();
}
public void run()
{
a.amethod(b);
}
}
class MainClass2 extends Thread
{
A a;
B b;
MainClass2(A a,B b)
{
super();
this.a=a;
this.b=b;
start();
}
public void run()
{
b.bmethod(a);
}
}
class A
{
public synchronized void amethod(B b)
{
System.out.println("Entered amethod");
try{
Thread.sleep(500);
}catch(Exception e){}
b.bsum(2,3);
}
public synchronized void asum(int a,int b)
{
System.out.println("Sum in A is");
System.out.println(a+b);
}
}
class B
{
public synchronized void bmethod(A a)
{
System.out.println("Entered bmethod");
try{
Thread.sleep(500);
}catch(Exception e){}
a.asum(3, 5);
}
public synchronized void bsum(int a, int b)
{
System.out.println("Sum in B is");
System.out.println(a+b);
}
}
答案 0 :(得分:4)
您似乎在另一个对象的方法中使用了对象 a 和 b 。当被调用的方法被同步时,没有人可以使用它使用的资源,因此两种方法都需要锁定的东西=>僵局。您应该同时使用两种方法的公共对象,最好是两种方法之外的方法。
答案 1 :(得分:1)
实际上你已经启动了两个线程......让我们调用线程1和2
所以当线程1获得对象A的锁定并同时调用方法amethod时会发生什么 线程2获得了对象B的锁定并称为bmethod。 现在A想要调用被锁定的b的sum方法,因为B已经锁定了对象B. 并且B想要调用A的sum方法,其中A已经获得了A的对象,并且它没有释放锁,直到它完成了调用sum方法。
只需从sum方法中删除synchronized关键字,它就可以工作(我的意思是不会陷入死锁状态)