写点什么

Swift 5.10 重磅更新:并发代码安全性再上新台阶

  • 2024-03-29
    北京
  • 本文字数:1007 字

    阅读完需:约 3 分钟

大小:491.21K时长:02:47
Swift 5.10 重磅更新:并发代码安全性再上新台阶

最新发布的 Swift 5.10 版本虽然只带来了少数新提案,但在语言的并发模型方面却取得了显著进步。Swift 团队工程师 Holly Borla 解释说,现在编译器已经能够在编译阶段确保数据的完全隔离。


Borla 回顾了 Swift 并发模型自 Swift 5.5 引入 async/await、actors 和结构化并发以来的成熟过程。从 Swift 5.7 采用 Sendable 协议作为线程安全类型的基石,到 Swift 5.10 实现编译时完全数据隔离,每一步都体现了 Swift 在并发编程领域的持续进步。


Swift 5.10 在语言的各个方面全面完善了数据竞态安全语义,并修复了 Sendable 和 actor 隔离检查中的大量 bug,从而加强了完全并发检查的保证。实际上,Swift 5.10 编译器新增了一个名为 -strict-concurrency=complete 的标志,这个标志能在编译时检测潜在的数据竞态,从而加强并发编程的安全性。在之前的 Swift 5.9 版本中,某些隔离违规问题只能在运行时通过断言来检测,而在 Swift 5.10 中,这些问题在编译阶段就会被标记为潜在的编程错误,并引发警告。


虽然这种更严格的行为有助于提升代码的安全性,但也可能导致误报,即正确的代码被错误地标记。Borla 指出,这是由于编译器需要减少分析量以控制编译时间成本,这一问题将在未来的语言版本中得到改进。


为了应对这种情况,开发者可以在特定的 actor 或实现 Sendable 协议的类上使用 nonisolated(unsafe)@unchecked Sendable 来局部禁用完全数据隔离检查。但需要注意的是,这种做法将使代码进入 “不安全” 的领域,因此在选择退出完全数据隔离检查时,务必谨慎行事,确保自己了解潜在的风险。正如 iOS 开发者和 Swift 书籍作者 Donny Wals 所建议的:


每当你想使用 nonisolated(unsafe) 时,最好先反思一下:是否可以考虑将标记为隔离的类型转变为全局 actor,或者是否可以将属性的类型设定为 Sendable 且设置为不可变。在 Swift 5.10 编译器中,安全访问共享状态的方式主要有两种:一是结合使用不可变状态与 Sendable,二是利用 @MainActor 将共享状态封装在全局 actor 中。


然而,在编译那些使用信号量或 DispatchQueues 手动确保隔离的旧代码时,可能需要用到不安全的退出指令,这一点需要注意。


如前所述,Swift 5.10 的并发模型并非尽善尽美,有时可能会产生过多的数据竞态误报。据 Borla 透露,Swift 团队正在积极改进这一点,为即将在下一次 Apple WWDC 大会上发布的 Swift 6 版本做好充分准备。


原文链接

https://www.infoq.com/news/2024/03/swift-5-10-released/

2024-03-29 08:004709

评论

发布
暂无评论
发现更多内容

🌏【架构师指南】带你分析认识缓存穿透/雪崩/击穿

洛神灬殇

缓存穿透 缓存击穿 缓存雪崩 6月日更

马丁策略量化交易系统搭建,网格量化策略系统

【Flutter 专题】106 图解 AnimatedWidget & AnimatedBuilder 动画应用

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

三步教你编写一个Neumorphism风格的小时钟

空城机

JavaScript Vue 大前端 6月日更

kubelet分析-pvc扩容源码分析

良凯尔

Kubernetes 源码分析 kubelet Ceph CSI

Windows PowerShell ISE 是什么和 PowerShell 有什么区别

HoneyMoose

如何拆分大型单体系统为微服务

Zhang

微服务

网络攻防学习笔记 Day42

穿过生命散发芬芳

网络攻防 6月日更

JAVA对象直接输出的打印结果是什么?

加百利

Java 后端 字符串 6月日更

Kubernetes手记(9)- Ingress 控制器

雪雷

k8s 6月日更

小型电商微服务架构拆分

Simon

架构实战营

系统设计系列之任务队列

看山

MQ 6月日更

Django组队学习Task0

IT蜗壳-Tango

IT蜗壳教学 6月日更 Datawhale

读深入ES6记[五]

蛋先生DX

ES6 6月日更

区块链行业的《高考志愿填报指南》

CECBC

金三银四跳槽季,美团、字节、阿里、腾讯Java面经,终入字节

Java 程序员 架构 面试

图解 SQL,这也太形象了吧!

xcbeyond

MySQL 6月日更

🌏【架构师指南】教你如何设计和规划系统架构(13条)

洛神灬殇

架构设计 架构设计原则 架构师技能 6月日更

2021年最新阿里巴巴Java面试权威指南(泰山版)震撼来袭

Java 程序员 架构 面试 计算机

22 图 |M1 和 Docker 谈了个恋爱

悟空聊架构

Mac M M1 Dock 6月日更 dokcer

并发王者课-黄金1:两败俱伤-互不相让的线程如何导致了死锁僵局

MetaThoughts

Java 多线程 并发

NQI国家质量基础设施“一站式”公共服务平台开发建设

源中瑞-龙先生

开发 NQI 质量基础设施“一站式”

深入SpringBoot的异常处理(一)

卢卡多多

异常 SpringBoot 2 全局异常 6月日更

栈和队列没想象中那么难

北游学Java

Java 数据结构 队列

GitHub已霸榜!阿里技术官肝了3个月才完成的20万字Java面试手册

Java 程序员 架构 面试

Windows 使用 PowerShell 来管理另外一台 Windows 机器

HoneyMoose

Java Shutdown Hook 场景使用和源码分析

陈皮的JavaLib

Java 线程安全 Thread

颠覆与创新,区块链将成音乐产业的下一个风口

CECBC

给dubbo贡献源码,做梦都在修bug

捉虫大师

dubbo

职场礼仪之坐车礼仪

石云升

6月日更 职场礼仪

Python——列表元素的排序

在即

6月日更

Swift 5.10 重磅更新:并发代码安全性再上新台阶_大前端_Sergio De Simone_InfoQ精选文章