【问题标题】:Why do we need for ParHashMap from Scala while there is ConcurrentHashMap from Java为什么我们需要来自 Scala 的 ParHashMap 而有来自 Java 的 ConcurrentHashMap
【发布时间】:2017-05-24 07:50:22
【问题描述】:

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

【问题讨论】:

  • ConcurrentHashMap 不是无锁的
  • @talex 我认为它曾经是非无锁的,但在 Java 8 中发生了变化。
  • @Louis Wasserman ConcurrenHashMap 一直是 lock-free,但在 Java 7 中,它通过利用 Lock stripping 并发模式与 Node 有另一种结构,但在 Java 8 中它发生了变化 - 这种方法被禁用,rb tree 以防发生碰撞。
  • 它提供了无锁查询、某些无锁更新操作和不同key的并发更新。但是当对同一个键执行原子更新时,同步是不可避免的。

标签: java scala data-structures trie concurrenthashmap


【解决方案1】:

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

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

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

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

【讨论】:

  • @你说:“如果你在这里执行操作(比如map()、filter()、aggregate())Scala会帮你并行化”是不是和Spark并行化机制类似?跨度>
  • 其实Spark的发明者说他在发明RDD抽象的同时,从Scala的并行集合中汲取了灵感。
  • 我认为在 scala 中使用线程安全可变哈希映射的最佳选择是使用此处的实现:stackoverflow.com/a/17542165/1553233。为此使用 ParHashMap 不是工作的正确工具(即使您可以强制使用它)。
  • 从 Java 8 开始,ConcurrentHashMap 还支持多种并行处理方法,请参阅以forEach…reduce…search… 开头的方法(或一般所有方法都有第一个参数@ 987654335@).
  • 我没有说它是线程安全的。可能不是。我认为您不会想从多个线程中调用它。它有点超出目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多