在Scala计划中,我有:
var steps : ListBuffer[Step] = new ListBuffer[Step]
var newsteps : ListBuffer[Step] = new ListBuffer[Step]
// why par is not working ?
steps.foreach(step => newsteps ++= step.execute())
这很有效。 step
仅在内部状态下运行,所有数据都是不可变的。然而,当我添加par
来并行化工作时:
steps.par.foreach(step => newsteps ++= step.execute())
结果不可预测。我在这里错过了什么吗?
答案 0 :(得分:0)
ListBuffer
不是线程安全的,你从多个线程中追加它(newsteps++=
)(当你在并行集合上调用foreach
时会发生这种情况。)
此外,Scala不鼓励将副作用与并行操作混合:
给定并行集合框架的并发执行语义,通常应避免对集合执行的操作引起副作用,以便维持确定性。
http://docs.scala-lang.org/overviews/parallel-collections/overview.html