【发布时间】:2011-12-19 21:08:37
【问题描述】:
我正在制作一个应用程序,它需要一堆日记帐分录并计算总和。
当有 多个线程 调用 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);
}
非常感谢!
更新:
感谢大家的回答,我已经知道上面的代码不是线程安全的。
感谢 Vint 建议使用 AtomicReference 替代 synchronize。我之前使用AtomicInteger 来保存整数和,我想知道 BigDecimal 是否有类似的东西。
两者的优劣是否有定论?
【问题讨论】:
标签: java concurrency thread-safety bigdecimal concurrent-collections