在java中,我需要计算每个键的项目,所以我想用ConcurrentMap
键和价值有AtomicInteger
但是我不知道是否有更好的方法。它不是一个关键的服务,它只是用来收集统计数据,所以我不介意如果我迟到了10秒,并且有正确的数据或者类似的东西。所以我想知道在标准的java并发中是否有更好的做法,或者我是否再次用自己处理ConcurrentMap和AtomicInteger
(一个可以解决问题的例子也许是消息传递,如果是的话能够帮助我吗?)(最好是用例子......)一些不会有性能问题的东西,并且也是安全的,并且易于使用,我不介意延迟。在java中每个键的计数最佳做法是什么
1
A
回答
4
番石榴提供了ConcurrentHashMultiset
。这是一个并发的Multiset
实现,它实际上是一个允许重复的集合。像往常一样,您可以add(E)
和remove(Object)
,但也可以检索Multiset
中元素的count(Object)
。
其实this is implemented使用的是支持ConcurrentHashMap<E, AtomicInteger>
,所以你的练习完全没问题。但是:
Multiset
接口提供更好的抽象,它甚至延伸Collection
。- 正确管理这些
AtomicIntegers
你自己是一件棘手的事情。快速浏览番石榴的代码应该能够让您了解并发编程带来的挑战:您需要大量的compareAndSet
s和无限的while
循环来确保正确的结果出来。
0
是的,我认为这是正确的方向,所以我真的不明白为什么你认为这不容易。只需使用并发地图特定功能。即更新统计将为:
AtomicInteger newCounter = new AtomicInteger(1);
AtomicInteger existingCounter = map.putIfAbsent(key, newCounter);
if(existingCounter != null)
existingCounter.incrementAndGet();
相关问题
- 1. 最佳做法是什么?
- 2. 存储分析统计数据的最佳做法是什么?
- 3. 编程数学计算的最佳做法是什么?
- 4. 什么应该是关键在散列表的最佳做法
- 5. log4cxx的最佳做法是什么?
- 6. 什么是ViewModel的最佳做法
- 7. 在Javascript中比较一个值的最佳做法是什么?
- 8. 在“创建”中保存多个外键的最佳做法是什么?
- 9. 在.NET中加密数据的最佳做法是什么?
- 10. 在JSP中验证参数的最佳做法是什么?
- 11. 在ng-grid中做列总数的最佳方法是什么?
- 12. 在JavaScript中构造函数的最佳做法是什么?
- 13. 在JSP中呈现JSON数据的最佳做法是什么?
- 14. 在Swift中迭代AnyObject数组的最佳做法是什么?
- 15. 在URL中隐藏主键数据库的最佳做法是什么?
- 16. Nginx和runit ....什么是最佳做法
- 17. WCF休息 - 最佳做法是什么?
- 18. ASP.NET缓存,什么是最佳做法
- 19. 创建数百个对象的最佳做法是什么?
- 20. 在Java中导出函数对象的最佳做法是什么?
- 21. 设计SOA WCF Web服务时的最佳做法是什么?
- 22. UI设计的最佳做法是什么?
- 23. 编写详细设计文档的最佳做法是什么?
- 24. 设计android UI的最佳做法是什么?
- 25. 什么是存储在我的数据库OAuth键值的最佳做法?
- 26. 在angularjs中编写控制器方法设计的最佳做法是什么?
- 27. 在MVC什么是在表行中放置主键的最佳做法
- 28. 将XML转换为Java对象的最佳做法是什么?
- 29. 按键改变布尔?最佳做法是什么?
- 30. 在android中每分钟启动一次服务的最佳做法是什么?
听起来很完美。我按照你的建议看待实现,实际上它不是微不足道的。所以如果我添加10个类型的苹果项目,它不会存储10个项目,因为它的一套只会计算它苹果为10,对不对? – Jas
@Jason Yup,它在地图上只有一个包含'AtomicInteger'且值为'10'的'Apple'的条目。好处是你不必再考虑它了,所有这些都被抽象出来了,你可以使用'Multiset'接口来处理它。 –
谢谢,就像我看到的旁注有关于它的表现的讨论。 https://groups.google.com/forum/#!topic/guava-discuss/KJuv1P77vRI – Jas