我正在制作一个应用程序,它需要一堆日记帐分录并计算总和.
当有多个线程调用该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);
}
Run Code Online (Sandbox Code Playgroud)
非常感谢!
更新:
谢谢大家的答案,我已经知道上面的代码不是线程安全的.
感谢Vint建议AtomicReference作为替代品synchronize.之前我AtomicInteger用来保存整数和,我想知道BigDecimal是否有类似的东西.
关于两者的赞成和反对,这是一个明确的结论吗?
java concurrency thread-safety bigdecimal concurrent-collections
假设我有几百万的事件,在SQS队列,我希望尽快摆脱他们,但我不能只删除队列,使一个新的.
从队列中删除/排除这些事件的最快方法是什么?