2012-10-08 57 views
3

我在理解程序中死鎖情況的概念時有些困難。 我得到的輸出爲: 輸入的方法 輸入bmethod 然後發生死鎖情況。 現在,因爲我的amethod是一個同步方法,不應該先執行第一個命令,即調用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); 
    } 
} 

回答

1

其實你已經開始兩個線程...讓我們稱之爲線程1和2

因此發生的事情是,當線程1收購了對象的鎖,並呼籲在同一時間 線程的方法2 amethod方法已經獲得了對象B的鎖定並被稱爲bmethod。 現在A想要調用被鎖定的b的總和方法,因爲B已經鎖定了對象B. 而B想要調用A的和方法,其中A已經獲得A的對象並且它沒有釋放鎖直到完成sum方法的調用。

距離和方法去除synchronized關鍵字,它會工作(我指的不是進入死鎖狀態)

+0

請閱讀上面的解釋,它的工作原理沒有同步關鍵字只是證明它遵循解釋的方法。 – rbhawsar

+1

步驟1:線程1:去呼叫a方法和acauires鎖A。 步驟2:線程2:去調用bmethod和acauires鎖定B. 步驟3:線程1:想要調用對象B的sum方法,但不能獲得鎖,因爲它已經給B.乙 – rbhawsar

+0

尼古拉和rbhawsar非常感謝.. :) ..我想我得到了答案.. –

4

看來你正在使用的對象一個中的其他對象的方法B。當被調用的方法被同步時,沒有人可以使用它所使用的資源,因此這兩種方法都需要某種被鎖定=>死鎖的東西。您應該同時使用這兩種方法的通用對象,最好在兩者之外進行同步。

+0

感謝您的回答... 但我的第一個線程啓動時...在amethod方法使用B類對象,我的意思是它將首先執行,所以它應該釋放B類對象,然後下一個線程應該運行..?所以我不明白如何兩個方法被鎖定。 對不起,我有點搞砸了..請詳細說明.. –

+0

在rbhawsar的回答中有一個很好的解釋。當線程啓動時,你不知道什麼是先執行的... –