У меня этот вопрос на сегодняшнем интервью.Синхронизация банковского перевода
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 до одновременно. Итак, второй вопрос: как исправить тупик?
Возможный дубликат [Избегать примера тупика] (http://stackoverflow.com/questions/13326861/avoid-deadlock-example) – assylias
О, thx assylias – Azaro