我考虑了两个类似的集合 - Scala的ParHashMap
和Java的ConcurrentHashMap。它们都具有相同的时间复杂度,并且都是线程安全和无锁的,但它们在底层上基于不同的概念 - 分支和哈希表。这种推理引出了一个问题:既然有Java的ConcurrentHashMap,为什么还需要Scala的ParHashMap呢?
我考虑了两个类似的集合 - Scala的ParHashMap
和Java的ConcurrentHashMap。它们都具有相同的时间复杂度,并且都是线程安全和无锁的,但它们在底层上基于不同的概念 - 分支和哈希表。这种推理引出了一个问题:既然有Java的ConcurrentHashMap,为什么还需要Scala的ParHashMap呢?
ConcurrentHashMap
是一个线程安全的 Map<>
实现。如果多个线程同时访问它,它们将保持同步。
ParHashMap
是一个并行集合。如果在此执行操作(如 map()
、filter()
、aggregate()
),Scala 会自动为您并行化它(类似于 Spark,但仅在单个 JVM 内)。
总之,ConcurrentHashMap
提供了同步线程以实现并发的基本机制,ParHashMap
则同时处理了同步和执行。
编辑说明:请注意,ParHashMap
本身不一定是线程安全的。想法是从单个线程调用其方法,并让并行数据结构自己处理并行性。
ConcurrentHashMap
也支持几种并行处理方法,请参阅以forEach…
、reduce…
或search…
开头的方法(或通常具有第一个参数long parallelismThreshold
的所有方法)。 - Holger
ConcurrentHashMap
始终是 "无锁" 的,但在 Java 7 中,它通过利用 "Lock stripping" 并发模式来使用一个 Node 结构。但在 Java 8 中,这种方法被禁用,并且在冲突的情况下将会建立rb 树
。 - pacman