入力として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;
}
}
}
パフォーマンスの面でより良い実装はありますか? ところで、これはスレッドセーフですか?