1

我有用户列表,我通过汇总每个用户的值来将每个用户与每个其他用户进行比较。这很好用,但是当我尝试并行化时,我得到了多个竞争条件,因为变量 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
      }

    }

}

更新 :

我知道这似乎是一个毫无意义的例子,但我面临一个更复杂的问题,在这里我试图问一个最简单的问题,它将引导我朝着我试图解决的实际问题的方向前进。

4

2 回答 2

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
于 2013-08-22T13:48:24.033 回答
0

尝试使用AtomicInt同步的:

  val totalValue : new AtomicInt()

  for(u <- userList.par){
    for(u1 <- userList.par){
       totalValue.incrementAndGet(u1.value)
    }
  }
于 2013-08-22T14:45:35.883 回答