一連のジャーナルエントリを取得して合計を計算するアプリケーションを作成しています。
以下の方法は、メソッドを呼び出す複数のスレッドがある場合、スレッド/同時実行セーフaddToSum()
です。各呼び出しが合計を適切に更新するようにしたいと考えています。
安全でない場合は、スレッドの安全性を確保するために何をしなければならないかを説明してください。
synchronize
get/put が必要ですか、それとももっと良い方法がありますか?
private ConcurrentHashMap<String, BigDecimal> sumByAccount;
public void addToSum(String account, BigDecimal amount){
BigDecimal newSum = sumByAccount.get(account).add(amount);
sumByAccount.put(account, newSum);
}
本当にありがとう!
アップデート:
答えてくれてありがとう、私はすでに上記のコードがスレッドセーフではないことを理解しています。
AtomicReference
の代わりにを提案してくれた Vint に感謝しsynchronize
ます。以前は整数の合計を保持しAtomicInteger
ていましたが、BigDecimal にそのようなものがあるかどうか疑問に思っていました。
両者の長所と短所に関する決定的な結論はありますか?