今日のインタビューでその質問を受けました。
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) {
}
}
だから私は transfer() メソッドを書く必要があるので、それはスレッドセーフになり、アカウントの残高は >= 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 番目の質問は、デッドロックを修正する方法です。