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をロックしているためです。また、BはAのsumメソッドを呼び出したいと考えています。ここで、AはすでにAのオブジェクトを取得しており、 sumメソッドの呼び出しで行われます。

同期されたキーワードをsumメソッドから削除するだけで、機能します(つまり、デッドロック状態にならないことを意味します)

于 2012-10-08T06:53:43.187 に答える