- Published on
Swift6数据安全
- Authors
- Name
Swift 6 的一个重要目标,是在编译期尽可能发现并阻止数据竞争(data race),从而提升并发代码的安全性。
官方文档常见的表述是:
Swift 6 language mode 通过在编译阶段阻止 data race,来减少并发代码中的安全问题。
它是怎么做到的
核心机制是 数据隔离(data isolation)。
数据隔离的目标,是保证对可变状态(mutable state)的访问在并发环境下依然安全。
从概念上说,它和锁有些相似,都是为了避免多个执行单元同时不安全地访问同一份可变数据。
但和运行时加锁不同,Swift 6 更强调在 编译期 发现问题,而不是等程序跑起来之后再靠崩溃或竞态去暴露。
什么是隔离域
理解数据隔离时,一个有用的概念是 隔离域(isolation domain)。
你可以把它理解成“某一组受同一套并发规则保护的数据范围”。
这个范围可以很小,也可以很大,例如:
- 一个变量
- 一个对象
- 一个 actor
- 一个子系统
不同隔离域所保护的数据范围可能完全不同,但它们的目标是一致的:
避免共享可变状态被多个执行上下文不安全地同时访问。
小结
如果只抓重点,Swift 6 的并发安全可以先这样理解:
- 它想在编译期尽早发现 data race
- 它依赖数据隔离来约束可变状态的访问
- 隔离域是理解这套机制时的关键概念
后面如果继续展开,最值得接着写的会是:
actor和隔离的关系Sendable是怎么参与这套检查的- 为什么有些旧代码迁移到 Swift 6 会突然报很多并发错误