Published on

Swift6数据安全

Authors
  • Name
    Twitter

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 会突然报很多并发错误