我有一个可变数组,我有两种类型的调用:
def write(content, index): Unit
def read(index): Content
我希望有一个synchronized
块,以确保read
之后的write
将返回刚写入的相同内容:
<something>.synchronized {
write(content, index)
require(content == read(index))
}
我还需要具有并行性,以便多个线程可以同时访问不同的索引。显然,我可以使用一系列锁来实现相同的功能,但使用lock
和unlock
似乎有点矫枉过正,因为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中有更好的方法吗?
答案 0 :(得分:0)
在Scala中进行并发编程的最流行的方法是使用Akka。如果您需要多个并发读取和独占写入,实现此目的的一种简单方法是通过Agents。
在您的特定情况下,您可以拥有一系列代理。您可以从中获得的好处是数组本身可以是不可变的,因为将由各个代理来处理值的更改。