如何并行化集合并防止竞争条件

时间:2013-08-22 13:42:11

标签: scala

我有用户列表,我将每个用户与其他所有用户进行比较 值。这很好,但是当我尝试并行化时,由于多个线程同时访问变量totalVar,因此我得到了多个竞争条件。

我是否可以对如何并行添加每个列表的值进行一些指导?

import scala.collection.JavaConversions._
import collection.JavaConverters._

object Question {

  case class User(id: String, value : BigInt) 

  var userList : java.util.List[User] = new java.util.ArrayList[User] 

  def main(args: Array[String]) {

      userList.add(new User("1" , 1))
      userList.add(new User("2" , 1))
      userList.add(new User("3" , 1))
      userList.add(new User("4" , 1))

      //Compare each user to every other user by totaling their
      //values
          var totalValue : BigInt = 0

      for(u <- userList.par){
        for(u1 <- userList.par){
           totalValue = totalValue + u1.value
           println("Adding "+u1.id+","+u1.value+ ","+totalValue)
        }
        println("Total is "+totalValue)
        totalValue = 0
      }

    }

}

更新:

我知道这可能看起来像一个毫无意义的例子,但我面临一个更复杂的问题,在这里,我试图提出一个最简单的问题,它将引导我朝着我想要解决的实际问题的方向前进。 / p>

2 个答案:

答案 0 :(得分:1)

你可能不会因为有两个并行集合而获得太多收益(总结两个整数是非常轻量级的任务并且一遍又一遍地安排它不是一个好主意),只用一个更容易做到:

val total = 
  for(u <- userList.par) yield {
    var partialTotal = 0
    for(u1 <- userList){
      partialTotal += u1.value
      println("Adding "+u1.id+","+u1.value+ ","+totalValue)
    }
    partialTotal
  }.sum

答案 1 :(得分:0)

尝试使用已同步的AtomicInt

  val totalValue : new AtomicInt()

  for(u <- userList.par){
    for(u1 <- userList.par){
       totalValue.incrementAndGet(u1.value)
    }
  }
相关问题