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) {      
    }
}

だから私は 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 番目の質問は、デッドロックを修正する方法です。

4

1 に答える 1

5

オブジェクトを同じ順序でロックする必要があります。そうしないと、デッドロックが発生します。

ところで:ロックは実行される操作よりもはるかに高価であるため、グローバルロックまたは1つのスレッドのみを使用する方がよいでしょう。

于 2013-08-28T12:13:31.460 に答える