2013-08-28 75 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

您必须以相同的顺序锁定对象,否则会导致死锁。

顺便说一句:鉴于锁定比执行操作贵得多,所以最好使用全局锁定或仅使用一个线程。