/* Page prose (zh-Hans) */
"ActorsWrappingUp" = "# 小结\n\nactor 把你在[并发的陷阱](Concurrency%20Hazards.playgroundchapter/Overview)那一章里手动修复的那些 data race，通过一次只让一个任务进入它的状态，变成了一个由编译器强制执行的保证。用它来让共享状态变得*安全*，而不是让代码变得*快*。两处微妙之处，即重入以及什么会逃出 actor，才是真正学问所在，所以请仔细掂量下面这些要点。\n\n* **actor** 是一种引用类型，它通过允许**一次一个任务进入**来保护自己的可变状态，从构造上消除了那份状态上的 data race，并且它取代了手工打造的串行队列修复，由编译器强制执行这份保护，因此没有办法不小心跳过它。\n* 从**外部**访问隔离的状态需要 `await`（你可能要等待轮到自己）；从**内部**访问则是同步的。`nonisolated` 让只触碰不可变状态的成员退出隔离。\n* **重入：** 一个 actor 在每一次 `await` 时都会被释放，所以另一个任务可以进入。在 `await` 之前读到的值可能在它之后改变：让先检查再行动不含挂起，或者在恢复之后重新检查。\n* actor 关乎的是**安全，而不是速度。** 它们串行化访问，所以一条汇集到单个 actor 的热点路径会变成瓶颈：用它们来保护共享的可变状态，而不是用来并行化工作（那是任务组的用途）。\n* 跨越 actor / 任务边界的值必须是 **`Sendable`** 的：值类型通常是，普通的可变 class 不是。actor 只在状态活在它内部时保护它，所以返回一个可变 class 的引用会重新打开竞争。\n\n---\n\n## 接下来\n\n下一章，[全局 actor 与 Sendable](Global%20Actors%20and%20Sendable.playgroundchapter/Overview)，介绍那个把工作钉在 UI 线程上的 `@MainActor`，并讲述让一个类型可以安全共享的完整故事。\n\n[上一页](@previous)  |  第 7 / 7 页";
