【问题标题】:Java: multi-threaded maps: how do the implementations compare?Java:多线程映射:实现如何比较?
【发布时间】:2010-05-20 23:22:45
【问题描述】:

我正在寻找一个好的哈希映射实现。具体来说,它适用于创建大量地图,其中大部分都很小。所以内存是个问题。它应该是线程安全的(尽管丢失奇数 put 可能是一个不错的折衷方案,以换取更好的性能),并且 get 和 put 都快。我也想要一根棍子上的月亮,请带着正义的副秩序。

我知道的选项是:

  • 哈希映射。灾难性的非线程安全。

  • 并发哈希映射。我的第一选择,但这占用大量内存 - 每个实例大约 2k。

  • Collections.sychronizedMap(HashMap)。这对我来说没问题,但我确信必须有更快的替代方案。

  • Trove 或 Colt - 我认为它们都不是线程安全的,但也许代码可以调整为线程安全的。

还有其他人吗?关于什么时候什么比什么好有什么建议吗? Java 可以使用哪些真正好的新哈希映射算法来实现?

提前感谢您的意见!

【问题讨论】:

  • 不要忘记古老的哈希表。已弃用,但仍可在遗留 Java 代码中找到。
  • @Uri:它是带有小写 t 的 Hashtable :) 谈到传统......
  • 您还可以通过调整 concurrencyLevel 构造函数参数来设法扩展 ConcurrentHashMap 的占用空间。

标签: java multithreading hashmap


【解决方案1】:

Collections.synchronizedMap() 简单地使所有Map 方法synchronized

ConcurrentMap 确实是您想要的接口,并且有多种实现方式(例如ConcurrentHashMapConcurrentSkipList)。它有几个Map 对线程安全操作不重要的操作。此外,它比同步的Map 更精细,因为操作只会锁定支持数据结构的一部分,而不是整个事物。

【讨论】:

    【解决方案2】:

    我没有以下方面的经验,但我曾经参与过一个项目,该项目发誓 Javolution 致力于实时和内存敏感任务。

    我注意到 API 中有一个声称是线程安全的 FastMap。正如我所说,我不知道它是否对你有任何好处,但值得一看:

    API for FastMap

    Javolution Home

    【讨论】:

    • 谢谢 - FastMap 看起来很有趣且高度可配置。
    【解决方案3】:

    Google CollectionMapMaker 似乎也可以完成这项工作。

    【讨论】:

      【解决方案4】:

      非常令人惊讶的是它有 2k 的脚印!!如何降低ConcurrentHashMap 的并发设置(例如 2-3),并优化其初始大小(= 变小)。

      我不知道内存消耗从何而来,但可能与维护条带锁有关。如果你降低并发设置,它会更少。

      如果您想通过开箱即用的线程安全获得良好的性能,ConcurrentHashMap 真的很棒。

      【讨论】:

      • 噢!我没想到你可以调整 ConcurrentHashMap 的设置。
      【解决方案5】:

      嗯,Apache Mahout 中有一个经过修饰的 Colt。它仍然不在当前的业务中。使用同步块保护代码有什么问题?您是否期待一些极其复杂的方案,其持有比putget 更小粒度的锁?

      如果您可以编写代码,请将其贡献给 Mahout。

      【讨论】:

      • 我想我需要同步 get 和 puts,否则 rehash 可能会导致 get() 返回垃圾。并且该同步将在地图本身(而不是键)上。它会起作用,但感觉不太理想。
      • 这就是我的意思,或多或少。
      【解决方案6】:

      值得看看 Clojure 中的持久哈希映射。

      这些是不可变的、线程安全的数据结构,其性能可与经典 Java HashMap 相媲美。如果你想要一个可变地图,你显然需要包装它们,但这应该不难。

      http://clojure.org/data_structures

      【讨论】:

        猜你喜欢
        • 2015-11-03
        • 2011-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多