4

我读了这个问题(以及其他几个问题):

原子属性和非原子属性有什么区别?

我完全理解(至少我希望如此 :-D)属性的原子/非原子说明符是如何工作的:

  1. Atomic 保证“读”操作不会被“写”操作中断。Nonatomic 不保证这一点。

  2. 原子和非原子都不能解决竞争条件,即一个线程正在读取,两个线程正在写入。无法预测读取操作将返回什么结果。这需要通过额外的同步来解决。

  3. 原子和非原子都不能保证整体数据完整性;一个线程可以设置一个属性,而另一个线程将第二个属性设置为与第一个属性的状态不一致的状态。这也需要通过额外的同步来解决。

让我挑眉的是,人们分为两个阵营:

nonatomicPro atomic:仅用于性能优化是有意义的。

如果您不进行优化,那么由于第 1 点,您应该始终使用 atomic。这样,在多线程应用程序中读取此属性时,您不会得到一些完全的废话。当然,如果您关心第 2 点和第 3 点,则需要在其之上添加更多同步。

反对原子:使用原子根本没有意义。

由于 atomic 并不能解决多线程应用程序中的所有问题,因此使用它根本没有意义,因为无论如何您都需要在其之上添加更多同步代码。它只会让事情变慢。

我倾向于亲原子阵营,但我想做一个健全的检查,我没有错过任何东西。

4

1 回答 1

6

缺乏一个非常具体的问题(尽管仍然是一个很好的问题),我将用个人经验来回答,FWIW。

一般来说,并发设计很难。借助 GCD 和 ARC 等现代便利,实现并发系统的工具无疑得到了改进。但是,并发的架构还是很困难的。

而且,一般来说,困难的部分与个人属性无关。单独的 getter 和 setter。并发是在更高级别实现的东西。

当前最先进的技术是孤立的并发。也就是说,您的应用程序中同时运行的部分使用与应用程序其余部分的连接极少的对象的隔离图来执行此操作(通常,“连接”是通过捆绑一些状态和折腾的回调)它转移到其他一些队列,通常是更新 UI 的主队列)。

通过将并发表面积(必须是并发安全的代码入口点的数量)保持在绝对最小值,您可以减少复杂性和调试非常奇怪的、通常无法重现的并发问题的时间(那会吃掉你的理智)。

鉴于所有这些,原子属性的价值非常小。当然,它们对于应该是非常非常小的接口集(API)很有用,可能会被多个线程撞到,但仅此而已。

如果您的对象需要快速访问访问器,那么将它们设为原子可能会对性能造成重大影响,但过早的优化是魔鬼的指手画脚。

于 2013-02-15T21:08:29.883 回答