Я делаю приложение, которое берет кучу записей в журнале и вычисляет сумму.
Ниже приведен пример использования потока / concurrency, когда существует несколько потоков, вызывающих метод addToSum()
. Я хочу, чтобы каждый вызов обновлял общее количество.
Если это небезопасно, объясните, что мне нужно сделать для обеспечения безопасности потоков.
Нужно ли мне synchronize
получить/поставить или есть лучший способ?
private ConcurrentHashMap<String, BigDecimal> sumByAccount;
public void addToSum(String account, BigDecimal amount){
BigDecimal newSum = sumByAccount.get(account).add(amount);
sumByAccount.put(account, newSum);
}
Большое спасибо!
Update:
Спасибо всем за ответ, я уже понял, что код выше не потокобезопасен.
Спасибо Vint за предложение AtomicReference
в качестве альтернативы synchronize
. Я использовал AtomicInteger
для хранения целочисленных сумм раньше, и мне было интересно, есть ли что-то подобное для BigDecimal.
Является ли окончательный вывод о pro и con двух?