Akka演员并发问题

时间:2013-03-24 10:07:46

标签: scala akka actor

假设我有三个Actors彼此通信:ActorControl,ActorA,ActorB。

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

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

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

我的问题是我是否通过这种方式破坏了玩家的并发性?

1 个答案:

答案 0 :(得分: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
  }

}

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