在scala中使用IndexedSeq监视器或锁

时间:2014-06-24 00:52:22

标签: scala concurrency

我有一个可变数组,我有两种类型的调用:

def write(content, index): Unit
def read(index): Content

我希望有一个synchronized块,以确保read之后的write将返回刚写入的相同内容:

<something>.synchronized {
  write(content, index)
  require(content == read(index))
}

我还需要具有并行性,以便多个线程可以同时访问不同的索引。显然,我可以使用一系列锁来实现相同的功能,但使用lockunlock似乎有点矫枉过正,因为synchronized块更简单,并使用类似的东西:

val monitors = (0 until n).map(i => i.toString)
...
monitors(index).synchronized {
  write(content, index)
  require(content == read(index))
}

甚至

val monitors = (0 until n).map(_ => new Object)
...
monitors(index).synchronized {
  write(content, index)
  require(content == read(index))
}

看起来有点像黑客。在Scala中有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

在Scala中进行并发编程的最流行的方法是使用Akka。如果您需要多个并发读取和独占写入,实现此目的的一种简单方法是通过Agents

在您的特定情况下,您可以拥有一系列代理。您可以从中获得的好处是数组本身可以是不可变的,因为将由各个代理来处理值的更改。