Scala并行集合在某些方面比Java中已有的并行集合更好吗?

bar*_*mac 12 java collections parallel-processing concurrency scala

我最近一直在学习各种Java并发库,ConcurrentHashMap以及来自Cliff Click的可爱非阻塞库

我对Scala了解不多,但我听说过最近的并行集合库.

我想知道这个库对基于Java的库有哪些主要优点?

Rex*_*err 26

这两个系列用于不同的用途.

Java的并发集合允许您从并行上下文中使用它们:许多线程可以同时访问它们,并且集合将确保做正确的事情(因此调用者不必担心锁等).

相比之下,Scala的并行集合旨在自行运行高阶运算,而无需担心创建线程.所以你可以这样写:

myData.par.filter(_.expensiveTest()).map(_.expensiveComputation())
Run Code Online (Sandbox Code Playgroud)

并且过滤器和地图将各自并行执行(但过滤器将在地图开始之前完成).

  • @barrymac - 不,你不能得出结论.它是一个完整的库,包含您期望从功能语言中获得的所有典型折叠,地图和过滤器.并行集合只是库的一部分; 它们尽可能并行运行,但完全透明.没有"DSL",因为大多数操作的语法与任何其他集合的语法完全相同(例如,在超类(例如`GenSeq`)上映射,而不知道或关心地图是否连续发生或并行. (2认同)

Lan*_*dei 7

为了扩展Rex的答案:Scala中Java风格并发可修改集合不是很有趣的原因是它对可移植数据的偏见:在Scala中实现并发的最常见方式是actor模型(依赖于不可变数据) ,而不是线程.


axe*_*l22 5

除了上面关于并发和并行集合的Rex Kerr的回答有两个不同的目的,我想补充一点,Java实际上有一个由Doug Lea在额外的JSR 166包中实现并行数组实现 - 这个集合允许对数组元素执行批量操作,虽然不适合没有显式同步的并发访问.这里的一个很大的区别是Scala并行集合也有其他集合的并行实现,而不仅仅是数组.这些是:

  • ParVector
  • ParRange
  • mutable.ParHashMap
  • mutable.ParHashSet
  • immutable.ParHashMap
  • immutable.ParHashSet

这些集合的所有顺序变体都可以直接转换为它们的并行对应物(方法par).其他顺序集合可以在线性时间内相对于集合大小转换为上述集合中的一些.

一些其他数据结构正在为将来的版本发布,包括一些并行集合,这些集合也允许并发访问.

  • 并行数组本身的链接是http://gee.cs.oswego.edu/dl/jsr166/dist/extra166ydocs/,并且可能足以让人们相信你想要用Scala方式,而不是Java方式. (5认同)