为什么我们需要来自 Scala 的 ParHashMap 而有来自 Java 的 ConcurrentHashMap

pac*_*man 3 java scala trie concurrenthashmap data-structures

我考虑了两个具有相似概念的集合 -ParHashMap来自 Scala 和来自 Java 的 ConcurrentHashMap。它们都具有相同的时间复杂度,并且都是线程安全和无锁的,但它们仅基于不同的概念——相应的特里和哈希表。这个推理导致了一个问题:为什么我们需要来自 Scala 的 ParHashMap 而有来自 Java 的 ConcurrentHashMap?

mar*_*ios 5

ConcurrentHashMap是线程安全的Map<>实现。如果您有多个线程同时访问它,它们将是同步的。

ParHashMap是一个平行集合。如果您在此处执行操作(如map(), filter(), aggregate()),Scala 将为您并行化它(类似于 Spark,但仅在单个 JVM 中)。

总而言之,ConcurrentHashMap提供同步线程以实现并发的原语,ParHashMap负责同步和执行。

编辑:请注意,ParHashMap它本身不一定是线程安全的。这个想法是从单个线程调用它的方法,并让并行数据结构本身处理并行性。

  • 我认为在 Scala 中使用线程安全可变哈希图的最佳选择是使用这里的实现:http://stackoverflow.com/a/17542165/1553233。为此使用 ParHashMap 不是该工作的正确工具(即使您可以强制使用)。 (2认同)
  • 从 Java 8 开始,`ConcurrentHashMap` 还支持多种并行处理方法,请参阅以 `forEach...`、`reduce...` 或 `search...` 开头的方法(或者通常所有方法都具有第一个参数 `long parallelismThreshold`)。 (2认同)