代码之家  ›  专栏  ›  技术社区  ›  Thilo

Concurrenthashmap有什么缺点吗?

  •  5
  • Thilo  · 技术社区  · 14 年前

    我需要一个可以从多个线程访问的哈希映射。

    有两个简单的选项,使用普通哈希图并在其上进行同步,或者使用ConcurrentHashMap。

    由于ConcurrentHashMap不会阻止读取操作,因此它似乎更适合我的需要(几乎是独占读取,几乎从不更新)。 另一方面,我希望并发性非常低,因此不应该存在阻塞(只是管理锁的成本)。

    地图也会非常小(在十个条目下),如果这有区别的话。

    与常规的hashmap相比,读写操作的成本要高出多少(我假设它们是这样的)?或者,不管读/更新的比率和大小,当可能有中等级别的并发访问时,ConcurrentHashMap总是更好吗?

    4 回复  |  直到 14 年前
        1
  •  6
  •   Stephen C    14 年前

    另一方面,我希望并发性非常低,因此不应该存在阻塞(只是管理锁的成本)。

    获取和发布 不争 Java互斥(原始锁)很小。因此,如果你认为竞争的概率很低,那么 HashMap 可能是你最好的选择。

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

    *…除非你有 真的? 良好的直觉。

        2
  •  2
  •   andersoj    14 年前

    当与 HashMap . 多少钱?猜猜看…在应用程序中测量它…;-)

    如果您发现实际存在性能问题,可能有一个非常专门的<10项解决方案,比从中组装出来的任何解决方案都要便宜。 java.util 着陆,但在你知道你有性能问题之前,我不会跳到那个。

        3
  •  2
  •   sjlee    14 年前

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

    另一方面,concurrenthashmap(在实例级别)的内存占用比hashmap稍大一些。如果您有大量的小型chm,那么这个开销可能会加起来。

        4
  •  0
  •   bestsss    14 年前

    主要问题w/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/