繁体   English   中英

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

[英]what is the best practice for counting per key in java

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

Guava提供了ConcurrentHashMultiset 这是一个并发的Multiset实现,它实际上是一个允许重复的集合。 您可以像往常一样add(E)remove(Object) ,但也可以检索Multiset元素的count(Object)

事实上, 这是使用支持ConcurrentHashMap<E, AtomicInteger> ,所以你的练习完全没问题。 然而:

  • Multiset接口提供了更好的抽象,它甚至扩展了Collection
  • 正确地管理这些AtomicIntegers是一件棘手的事情。 快速浏览一下Guava的代码应该让你了解并发编程所带来的挑战:你需要大量的compareAndSet和无限的while循环来确保正确的结果出来。

是的,我认为这是正确的方向,所以我真的不明白你为什么认为这不容易。 只需使用并发映射特定功能。 即更新统计数据将是:

AtomicInteger newCounter = new AtomicInteger(1);
AtomicInteger existingCounter = map.putIfAbsent(key, newCounter);
if(existingCounter != null) 
  existingCounter.incrementAndGet();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM