Как сделать обновление BigDecimal в ConcurrentHashMap потокобезопасным

Я делаю приложение, которое берет кучу записей журнала и вычисляет сумму.

Приведенный ниже способ сделать это безопасным для потоков / параллелизма, когда имеется несколько потоков , вызывающих метод 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.

Является ли окончательный вывод о плюсах и минусах двух?

16
задан Desmond Zhou 19 December 2011 в 22:46
поделиться