我读到非原子和原子都是线程不安全的。但非原子速度更快,因为它允许更快的访问意味着异步,原子速度更慢,允许更慢的同步访问。
答案 0 :(得分:1)
Objective C中的atomic
属性可确保您永远不会看到部分写入。
也就是说,如果两个线程同时将值A和B写入同一个变量X,那么对同一个变量的并发读取将产生X的初始值,或者A或B.使用nonatomic
不再给予保证。您可以获得任何值,包括您从未明确写入该变量的值。
这样做的原因是,对于nonatomic
,读取线程可以读取变量,而另一个线程正在写入它。因此,您阅读的部分内容来自旧值,而另一部分来自新值。
关于它们都是线程不安全的评论指的是除此之外没有给出额外的保证。 Apple's docs在此提供以下示例:
考虑
XYZPerson
对象,其中一个人的第一个和最后一个 使用来自一个线程的原子访问器更改名称。如果另一个 线程同时访问两个名称,原子getter方法 将返回完整的字符串(没有崩溃),但没有 保证这些值相对于每个值都是正确的名称 其他。如果在更改之前访问了第一个名称,则是最后一个名称 更改后访问名称,最终会出现不一致的情况, 不匹配的一对名字。
纯粹主义者可能会争辩说,线程安全的这个定义过于严格。从技术上讲,atomic
已经处理了数据竞赛和排序,从语言设计师的角度来看,这就是你所需要的。
另一方面,从应用程序逻辑的角度来看,前面提到的 first-name-last-name 示例显然构成了一个bug。需要额外的同步来消除不期望的行为。在此特定于应用程序的视图中,类XYZPerson
不是线程安全的。但在这里,我们讨论的是线程安全性的水平与语言设计者的不同。