【发布时间】:2013-02-15 18:59:18
【问题描述】:
我读过这个问题(以及其他几个问题):
What's the difference between the atomic and nonatomic attributes?
我完全理解(至少我希望如此 :-D)属性的原子/非原子说明符是如何工作的:
Atomic 保证“读取”操作不会被“写入”操作中断。 Nonatomic 不保证这一点。
原子和非原子都不能解决竞争条件,即一个线程正在读取,两个线程正在写入。无法预测读取操作将返回什么结果。这需要通过额外的同步来解决。
原子和非原子都不能保证整体数据完整性;一个线程可以设置一个属性,而另一个线程将第二个属性设置为与第一个属性的状态不一致的状态。这也需要通过额外的同步来解决。
让我挑眉的是,人们分为两个阵营:
Pro atomic:使用nonatomic 仅用于性能优化是有意义的。
如果您不进行优化,那么由于第 1 点,您应该始终使用 atomic。这样,在多线程应用程序中读取此属性时,您不会得到一些完全的废话。当然,如果您关心第 2 点和第 3 点,则需要在其之上添加更多同步。
反对 atomic:使用 atomic 根本没有意义。
由于 atomic 并不能解决多线程应用程序中的所有问题,因此使用它根本没有意义,因为无论如何您都需要在其之上添加更多同步代码。它只会让事情变得更慢。
我倾向于亲原子阵营,但我想做一个健全的检查,我没有错过任何东西。
【问题讨论】:
-
好吧,我很懒,所以我只使用非原子并编写没有竞争条件的代码:) 但你决定,真的。我会选择“当你可以避免锁定时,为什么会有额外的开销,而且这还不够呢?”
-
恕我直言,现在有很多方法可以减少多线程应用程序中的状态(锁定)(NSOperations、GCD(在主线程上传递)、回调,甚至是 RAC),其中很多没有实际意义。我倾向于“在适当的时候使用”
-
问题到底是什么?一切都很好,你设定了一个坚实的前提,但你想要回答的具体问题是什么?如果它是“哪个阵营是正确的”,那么实际上并没有正确的答案(但是无论哪种方式都有很多错误的答案:)。
-
2bbum:主要是一个“健全性检查”问题。我只是想确保我没有错过任何重要的东西(我知道它有点不符合 SO 格式)。
标签: objective-c multithreading atomic declared-property