协程进阶:同步 07. Actor 模式

本篇解析 example-sync-07.kt。探讨如何利用“消息传递”而非“共享状态”来解决并发冲突。

1. 核心概念:什么是 Actor?

Actor 是由一个状态(State)、一个行为(Behavior)以及一个信箱(Channel)组合而成的实体。

工作原理:

  • 私有状态:状态被封装在 Actor 内部,外部无法直接修改。
  • 消息驱动:外部只能通过向 Actor 的 Channel 发送消息来请求修改或查询状态。
  • 串行处理:Actor 内部会按顺序、一个个地处理接收到的消息,从而天然地避免了并发冲突。

2. 代码解析 (Counter Actor)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 定义消息类型
sealed class CounterMsg
object IncCounter : CounterMsg()
class GetCounter(val response: CompletableDeferred<Int>) : CounterMsg()

// 启动 Actor
fun CoroutineScope.counterActor() = actor<CounterMsg> {
var counter = 0 // Actor 的私有状态
for (msg in channel) { // 串行处理每一条消息
when (msg) {
is IncCounter -> counter++
is GetCounter -> msg.response.complete(counter)
}
}
}

3. 开发者总结

“不要通过共享内存来通信,而要通过通信来共享内存。” Actor 模式完美地实践了这一哲学。它比锁(Mutex)更高级,因为它将状态管理逻辑彻底解耦到了一个独立的后台任务中。在处理复杂的、多来源的状态更新(如 Android 应用中的全局设置同步、长连接状态维护)时,Actor 模式是目前业界公认的最优雅方案。

,