当我发现自己100%使用非原子时,为什么"原子"是Objective C中的默认@property限定符?

CVe*_*tex 37 objective-c

在我作为iOS开发人员的几年里,我认为我从来没有在属性上使用过atomic.如果我可以看到由于线程导致的潜在竞争条件或数据完整性问题,那么在@property上使用atomic将无济于事.我使用传统的事务/工作单元线程安全技术(使用机制锁,信号量或其他).

有没有人(或知道)使用原子的任何实际例子?(我很想看到一些实际/实用的代码示例)

在写了非原子的第十亿次之后,我也想知道为什么Apple决定将原子设为默认值.

Tom*_*ana 22

至于你遇到的第一个问题,也许是因为

虽然"原子"意味着对属性的访问是线程安全的,但只是让你的类中的所有属性都是原子的并不意味着你的类或更普遍的对象图是"线程安全的" - 线程安全无法在关卡中表达个人访问方法.

至于为什么苹果默认为原子,我认为没有任何好的理由,这只是一个糟糕的设计决定.WWDC会议上的人们一再鼓励人们尽可能使用非原子技术来消除性能影响.

  • +1将其识别为糟糕的设计决策,并声明原子不是线程安全的银弹. (3认同)

BJ *_*mer 10

值得注意的是,在垃圾收集下,几乎所有合成访问器本质上都是原子的 - 原子和非原子版本之间没有区别,因为指针的简单分配就是两种情况下都需要的.既然你真的无法在垃圾收集下创建一个非原子合成访问器,他们可能已经决定默认情况下将事物设置为原子更有意义.

我没有任何证据证明这是决定背后的原因,但这对我来说是有道理的.

(如果你很好奇,仍然存在垃圾收集的情况,其中简单的赋值是非原子的 - 当值大于进程的字大小时会发生这种情况.实际上,这只发生在结构上.)

编辑:添加了来源

有关垃圾收集下合成属性的原子性的更多信息可以在Objective-C编程语言 - >声明的属性 - >性能和线程中找到,其中它说"在垃圾收集环境中,大多数合成方法都是原子的,不会产生这种开销".在2008年WWDC会议420"使用Objective-C使用垃圾收集"中,更明确地提到了固有的原子性,大约29分钟.


enn*_*lax 5

用两个词来说——线程安全。我们定期编写的大多数应用程序都相当简单,因此实际上会受益于没有额外的锁。

\n\n
\n\n

来自 Apple 的Objective-C 编程语言

\n\n

默认情况下,属性是原子的,因此合成访问器可以在多线程环境\xe2\x80\x94中提供对属性的稳健访问,也就是说,从 getter 返回的值或通过 setter 设置的值始终完全检索或设置,无论其他线程如何正在同时执行。有关详细信息,请参阅 \xe2\x80\x9c性能和线程。\xe2\x80\x9d

\n\n

如果不指定非原子,则在引用计数环境中,对象属性的合成 get 访问器使用锁并保留和自动释放返回值\xe2\x80\x94,实现将类似于以下内容:

\n\n
[_internal lock]; // lock using an object-level lock\nid result = [[value retain] autorelease];\n[_internal unlock];\nreturn result;\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果指定非原子,则对象属性的合成访问器将直接返回值。

\n