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)
并且过滤器和地图将各自并行执行(但过滤器将在地图开始之前完成).
为了扩展Rex的答案:Scala中Java风格并发可修改集合不是很有趣的原因是它对可移植数据的偏见:在Scala中实现并发的最常见方式是actor模型(依赖于不可变数据) ,而不是线程.
除了上面关于并发和并行集合的Rex Kerr的回答有两个不同的目的,我想补充一点,Java实际上有一个由Doug Lea在额外的JSR 166包中实现的并行数组实现 - 这个集合允许对数组元素执行批量操作,虽然不适合没有显式同步的并发访问.这里的一个很大的区别是Scala并行集合也有其他集合的并行实现,而不仅仅是数组.这些是:
ParVectorParRangemutable.ParHashMapmutable.ParHashSetimmutable.ParHashMapimmutable.ParHashSet这些集合的所有顺序变体都可以直接转换为它们的并行对应物(方法par).其他顺序集合可以在线性时间内相对于集合大小转换为上述集合中的一些.
一些其他数据结构正在为将来的版本发布,包括一些并行集合,这些集合也允许并发访问.