1

入力として2つの銀行口座を受け取り、それらの値を交換するメソッドがあります:

Public void TransferAccount(AccountID  id1, AccountID id2){
    Account a1 = id1.GetAccount();
    Account a2 = id2.GetAccount();

    //Swap amounts.

    Temp = a1.Balance;
    a1.Balance = a2.Balance;
    a2.Balance = Temp;
}

このメソッドを可能な限り最高のパフォーマンスでスレッドセーフにしたい (メソッドを同期させない可能性があることを意味すると思います)、デッドロックにも注意する必要があります。

私は次の解決策を考えました:

Public void TransferAccount(AccountID  id1, AccountID id2){
    Account a1 = id1.GetAccount();
    Account a2 = id2.GetAccount();

//Swap amounts.
    synchronized(a1){
        wait(a2);
        synchronized(a2){
            Temp = a1.Balance;
            a1.Balance = a2.Balance;
            a2.Balance = Temp;
        }
    }
}

パフォーマンスの面でより良い実装はありますか? ところで、これはスレッドセーフですか?

4

1 に答える 1