假设我有三个Actors彼此通信:ActorControl,ActorA,ActorB。
ActorA和ActorB与ActorControl进行通信。他们收到的消息大多不同,但他们也有一个相同的消息X.当他们得到X时,他们都需要执行Y功能。
为避免重复代码,我将函数Y取出来打包称为common的对象。
在这种情况下,可能会发生ActorA和ActorB在同一时间调用common.Y。
我的问题是我是否通过这种方式破坏了玩家的并发性?
答案 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
}
}
在最后两个函数中,您应该提供某种同步。但是,如果您依赖并行性,这可能会影响性能。