multithreading - Scala 同步最佳实践

标签 multithreading scala

我已经开始学习 Scala 和 Akka 作为 Actor 模型。例如,在像 C 这样的命令式语言中,我可以使用几种不同的方法来同步二叉树上的线程;一个简单的信号量或互斥量、原子操作等。

然而,Scala 是一种功能性的面向对象语言,它可以利用 Akka 库(例如)实现角色模型。 Scala 中应该如何实现同步?假设我有一棵二叉树,我的程序应该遍历它并对其执行不同的操作。例如,我应该如何确保两个不同的参与者不会同时删除同一个节点?

最佳答案

如果要对数据结构进行同步访问,只需使用AnyRefsynchronized 方法来同步一个 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/

相关文章:

scala - 有没有更聪明的方法来对猫做到这一点?

斯卡拉/Play : load template dynamically

java - 如何通过内部函数向 Action 函数返回异常?

scala - 使用 SBT 为不同的库版本构建

java - 如何使用多线程使用Camel File Component Consumer

java - 在线程之间传递工作项 (Java)

java - 如何将类放入 Scala 中 JJS ScriptEngine 的范围中

java - 停止 Swingworker 的后台工作

java - ExecutorService awaitTermination 卡住了

java - 使用 Java 线程创建测试碰撞检测的对象