深入Actor可重入性与分离任务:Swift并发的不确定性控制
揭示Swift Actor模型中的可重入(reentrancy)问题,以及detach独立任务如何打破actor隔离,保障线程安全的同时避免死锁。 · 难度:入门 · +10XP
深入Actor可重入性与分离任务:Swift并发的不确定性控制
Swift Actor保证了状态隔离,但可重入(reentrancy)可能导致意外的并行访问。你将理解actor为什么只有在await挂起点才能被其他任务切入,以及如何利用nonisolated、detach任务(Task.detached)创建不受actor约束的独立任务。本教程会展示几个导致竞争条件的反模式,以及正确使用detach进行后台计算的场景。
actor BankAccount {
private var balance: Int = 0
func deposit(_ amount: Int) async {
// 模拟异步延迟,此时可能被其他任务重入
let newBalance = balance + amount
await Task.sleep(1_000_000_000) // 1秒
balance = newBalance
}
nonisolated func printAccountInfo() {
// 不访问隔离属性,可被无限制调用
print("Account info requested")
}
}
// 分离任务示例
Task.detached {
let account = BankAccount()
await account.deposit(100)
}