Actor 重入问题的实战进阶
深入探讨 Swift Actor 中的重入(Reentrancy)问题,学习如何通过隔离设计避免数据竞争。 · 难度:入门 · +10XP
Actor 重入问题的实战进阶
Swift 的 Actor 模型虽然保证了数据隔离,但当一个 Actor 内部的方法在等待时(如使用 await),其他任务可能插入执行——这就是重入。本教程将演示如何识别重入产生的竞态条件,并通过内部状态机、不可变快照或同步 Actor 引用来控制重入边界。你会掌握构建安全并发容器的核心技巧。
actor BankAccount {
private var balance: Double = 0
private var isProcessing = false
func deposit(_ amount: Double) async {
// 防止重入:使用状态锁
guard !isProcessing else { return }
isProcessing = true
defer { isProcessing = false }
let newBalance = await calculateWithInterest(balance + amount)
balance = newBalance
}
private func calculateWithInterest(_ value: Double) async -> Double {
try? await Task.sleep(nanoseconds: 100_000_000)
return value * 1.02
}
}