2

假设我有三个 Actor 相互通信:ActorControl、ActorA、ActorB。

ActorA 和 ActorB 与 ActorControl 通信。他们收到的消息大多不同,但他们也有一个相同的消息 X。当他们得到 X 时,他们都需要执行功能 Y。

为了避免重复代码,我取出函数 Y 来打包名为 common 的对象。

在这种情况下,ActorA 和 ActorB 可能同时调用 common.Y。

我的问题是这种方式是否破坏了演员的并发性?

4

1 回答 1

4

您可以跨参与者共享代码,但不能共享数据。如果您的函数是纯函数(无状态且没有副作用),则根本没有问题。

这里有些例子:

object Helper {

  // Safe
  def incrementPure( total: Int, i: Int ) = total + i

  //Unsafe
  private var total = 0
  def incrementStateful( i: Int ) = { total += i; total }

  //Unsafe
  def incrementSideEffect( i: Int ) = {
    val total = readCurrentTotal()
    val total2 = total + i
    saveCurrentTotal( total2 )
    total2
  }

}

在最后两个函数中,您应该提供某种同步。但是,如果您依赖并行性,这可能会影响性能。

于 2013-03-24T10:11:09.430 回答