3

我在理解这个程序中死锁情况的概念时遇到了一些麻烦。我得到的输出为: Entered amethod Entered 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);
    }
}
4

2 回答 2

4

您似乎在另一个对象的方法中使用了对象ab 。当被调用的方法被同步时,没有人可以使用它使用的资源,因此两种方法都需要锁定 => 死锁的东西。您应该与两种方法的公共对象同步,最好是两者之外的一个。

于 2012-10-08T06:45:59.137 回答
1

实际上你已经启动了两个线程......让我们调用线程 1 和 2

所以当线程 1 获得对象 A 的锁并调用方法 amethod,同时线程 2 获得对象 B 的锁并调用 bmethod 时会发生什么。现在 A 想调用 b 的 sum 方法,因为 B 已经锁定了对象 B通过调用 sum 方法完成。

只需从 sum 方法中删除 synchronized 关键字,它就会起作用(我的意思是不会进入死锁状态)

于 2012-10-08T06:53:43.187 回答