Scala - 以线程安全的方式从并行访问数组

时间:2016-04-05 17:13:28

标签: scala

我有以下代码:

const char

我认为以这种方式访问​​arrayToAccess变量不是线程安全的。如何以线程安全的方式实现上述代码?另外,我可以控制anotherArray.par的并行度(例如,只使用8个可用的2个内核)吗?如果没有,有没有办法控制它?

1 个答案:

答案 0 :(得分:2)

你正在思考它。 只是做:

arrayToAccess = anotherArray.par
  .map { mathematicalCalculation _ }
  .seq
  .sorted
  .reverse
  .take(5)

它产生与您的代码相同的结果,但是线程安全。

更新如果您担心排序步骤需要时间,您可以在线性时间中选择前五名:

val top(data: Array[Int], n: Int) = {
val queue = PriorityQueue()(Ordering[Int].reverse)
data.fold(queue) { case(q,n) => 
   q.enqueue(n) 
   while(q.size > 5) q.dequeue
   queue
}
.toArray
.sorted
.reversed

关于配置并行性,我认为,这应该有所帮助:http://docs.scala-lang.org/overviews/parallel-collections/configuration

更新如果您担心排序步骤,可以用并行排序替换它,或者在线性时间折叠到有界优先级队列中,如下所示:

 def topN(data: Array[Int], n: Int) = {     
   val queue = PriorityQueue()(Ordering[Int].reverse) 
   data.foldLeft(queue) { case (q, x) => 
     q.enqueue(x)
     while(q.size > n) q.dequeue
     q
   }.dequeueAll.reverse