2013-08-28 114 views
1

我在今天的採訪中得到了這個問題。銀行轉帳同步

class BankAccount { 
    private int money; 

    public synchronized void deposite(int sum) { 
     money += sum; 
    } 

    public synchronized void withdraw(int sum) { 
     money -= sum; 
    } 

    public synchronized int getMoney() { 
     return money; 
    } 
} 

class accountManager { 
    public void transfer(BankAccount a, BankAccount b, int money) {  
    } 
} 

,所以我需要寫轉移()方法,所以這將是線程安全的賬戶餘額應爲> = 0。

public void transfer(BankAccount a, BankAccount b, int money) { 
    synchronized (a) { 
     synchronized (b) { 
      int temp = a.getMoney() - money; 
      if (temp >= 0) { 
       a.withdraw(temp); 
       b.add(temp); 
      } 
     } 
    } 
} 

我寫了這一點,但是當我們轉移它產生僵局a到b和從b到a同時進行。所以第二個問題是,如何解決僵局?

+2

[避免死鎖示例]的可能重複(http://stackoverflow.com/questions/13326861/avoid-deadlock-example) – assylias

+0

哦,thx assylias – Azaro

回答

4

您必須以相同的順序鎖定對象,否則會導致死鎖。

順便說一句:鑑於鎖定比執行操作貴得多,所以最好使用全局鎖定或僅使用一個線程。