持有非Sendable单例引用的类是否可符合Sendable协议?
MyClass是否符合Sendable协议?
结论是:MyClass不符合Sendable协议。
原因如下:
- Sendable的核心要求是类型能安全地在不同任务/线程间传递、使用,不会引发数据竞争。判断一个类是否符合Sendable,不仅要看自身状态,还要看它持有的所有引用类型是否都满足Sendable要求(或有明确的同步保护机制)。
- 虽然MyClass自身只有不可变的
networkHelper属性,但NetworkHelper是非Sendable且存在内部可变状态的类——哪怕它是单例,也改变不了它线程不安全的本质。 - 当MyClass的实例在不同线程间传递并调用
makeNetworkRequest时,本质是在不同线程访问NetworkHelper的非线程安全状态,这会引入数据竞争风险。而Sendable要求类型传递后,其所有关联的操作都是线程安全的,显然MyClass做不到这一点。
所以即使MyClass自身没有可变状态,只要它持有非Sendable的引用,且该引用指向的对象没有足够的线程安全保障,MyClass就不符合Sendable协议。
内容的提问来源于stack exchange,提问作者bdesham
相关产品推荐
相关产品推荐

