在java中计算每个键的最佳实践是什么?

时间:2013-06-23 10:15:23

标签: java concurrency

在java中我需要计算每个键的项目,所以我想使用ConcurrentMap使用键和值AtomicInteger然而我想知道是否有更好的方法。它不是一个关键的服务,它只是用于收集统计数据,所以我不介意我是否有10秒正确的统计数据或类似的东西。所以我想知道在标准的java并发中是否有更好的实践,或者我是否再次使用ConcurrentMap和AtomicInteger处理(一个也可以解决问题的例子就是消息传递可能,如果是,那怎么能帮助我?)(最好用例子......)一些不会出现性能问题而且安全性也好,而且易于使用的东西,我不介意延迟。

2 个答案:

答案 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();