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