5

我需要一个可从多个线程访问的 HashMap。

有两个简单的选项,使用普通的 HashMap 并在其上同步或使用 ConcurrentHashMap。

由于 ConcurrentHashMap 不会阻止读取操作,它似乎更适合我的需求(几乎完全读取,几乎从不更新)。另一方面,无论如何,我希望并发性非常低,所以不应该有阻塞(只是管理锁的成本)。

地图也将非常小(少于十个条目),如果这有所作为的话。

与常规的 HashMap 相比,读写操作的成本要高多少(我假设它们是)?或者,无论读取/更新比率和大小如何,即使可能存在中等级别的并发访问,ConcurrentHashMap 是否总是更好?

4

4 回答 4

6

另一方面,无论如何,我希望并发性非常低,所以不应该有阻塞(只是管理锁的成本)。

获取和释放无竞争的Java 互斥锁(原始锁)的成本微乎其微。因此,如果您认为争用的可能性非常低,那么简单HashMap的可能是您最好的选择。

但这都是猜想。除非并且直到您实际分析了您的应用程序,否则花在推测优化上的所有时间很可能 (*) 浪费了。

* ...除非你有很好的直觉。

于 2010-10-17T02:19:40.263 回答
2

HashMap. 多少?你猜怎么着......在你的应用程序中测量它...... ;-)

如果您发现您确实遇到了性能问题,那么可能有一个非常专业的解决方案,用于<10 个条目,它比任何在java.util陆地上组装的解决方案都便宜,但是在您知道您有性能问题之前,我不会跳到那个地方。

于 2010-10-17T02:09:22.473 回答
2

在吞吐量和性能方面,开销通常可以忽略不计。

另一方面,ConcurrentHashMap(在实例级别)的内存占用比 HashMap 稍大。如果您有大量小型 CHM,则此开销可能会增加。

于 2010-10-17T15:53:18.920 回答
0

CHM 的主要问题:除非您更改 c-tor 调用,否则它不能很好地扩展,但大多数情况下它不会针对可用内核自动扩展。

以下 3 个链接指向无锁哈希图
http://www.azulsystems.com/blog/cliff-click/2007-03-26-non-blocking-hashtable
http://www.azulsystems.com/blog/cliff-click /2007-04-01-non-blocking-hashtable-part-2
http://sourceforge.net/projects/high-scale-lib/

于 2011-01-24T12:18:16.147 回答