2013-08-28 2 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 до одновременно. Итак, второй вопрос: как исправить тупик?

+2

Возможный дубликат [Избегать примера тупика] (http://stackoverflow.com/questions/13326861/avoid-deadlock-example) – assylias

+0

О, thx assylias – Azaro

ответ

4

Вы должны заблокировать объекты в том же порядке, или вы достигнете взаимоблокировки.

BTW: если блокировка намного дороже, чем выполняемая операция, вам лучше использовать глобальный замок или только один поток.

Смежные вопросы