我已经开始学习 Scala 和 Akka 作为 Actor 模型。例如,在像 C 这样的命令式语言中,我可以使用几种不同的方法来同步二叉树上的线程;一个简单的信号量或互斥量、原子操作等。
然而,Scala 是一种功能性的面向对象语言,它可以利用 Akka 库(例如)实现角色模型。 Scala 中应该如何实现同步?假设我有一棵二叉树,我的程序应该遍历它并对其执行不同的操作。例如,我应该如何确保两个不同的参与者不会同时删除同一个节点?
最佳答案
如果要对数据结构进行同步访问,只需使用AnyRef
的synchronized
方法来同步一个 block 。例如:
object Test {
private val myMap = collection.mutable.Map.empty[Int, Int]
def set(key: Int, value: Int): Unit = synchronized { myMap(key) = value }
def get(key: Int): Option[Int] = synchronized { myMap.get(key) }
}
但是,使用 actor 的目的是避免线程相互阻塞,这会损害可伸缩性。 Actor 管理可变状态的方法是让状态对 Actor 实例私有(private),并且仅在响应消息时更新或访问。这是一个更复杂的设计,类似于:
// define case classes Get, Set, Value here.
class MapHolderActor extends Actor {
private val myMap = collection.mutable.Map.empty[Int, Int]
def receive {
case Get(key) => sender ! Value(myMap.get(key))
case Set(key, value) => myMap(key) = value
}
}
关于multithreading - Scala 同步最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22813870/