在java中我需要计算每个键的项目,所以我想使用ConcurrentMap
使用键和值AtomicInteger
然而我想知道是否有更好的方法。它不是一个关键的服务,它只是用于收集统计数据,所以我不介意我是否有10秒正确的统计数据或类似的东西。所以我想知道在标准的java并发中是否有更好的实践,或者我是否再次使用ConcurrentMap和AtomicInteger
处理(一个也可以解决问题的例子就是消息传递可能,如果是,那怎么能帮助我?)(最好用例子......)一些不会出现性能问题而且安全性也好,而且易于使用的东西,我不介意延迟。
答案 0 :(得分:4)
番石榴提供ConcurrentHashMultiset
。这是一个并发的Multiset
实现,实际上是一个允许重复的集合。您可以像往常一样add(E)
和remove(Object)
,但也可以检索count(Object)
中元素的Multiset
。
事实上,this is implemented使用支持ConcurrentHashMap<E, AtomicInteger>
,所以你的练习完全没问题。但是:
Multiset
界面提供了更好的抽象,甚至扩展了Collection
。AtomicIntegers
是一项棘手的事情。快速浏览Guava的代码可以让您了解并发编程所带来的挑战:您需要大量compareAndSet
s和无限while
循环来确保正确的结果出来。< / LI>
答案 1 :(得分:0)
是的,我认为这是正确的方向,所以我真的不明白为什么你认为这不容易。只需使用并发映射特定功能。即更新统计数据将是:
AtomicInteger newCounter = new AtomicInteger(1);
AtomicInteger existingCounter = map.putIfAbsent(key, newCounter);
if(existingCounter != null)
existingCounter.incrementAndGet();