如果我们使用 GCD,是否需要声明一个 属性 原子?

Do we need to declare a property atomic if we use GCD?

Grand Central Dispatch 是否关心原子和非原子关键字,或者我们无论如何都必须指定原子?

我知道 属性 声明中的 atomic 和 nonatomic 关键字会生成不同的 setter 和 getter,atomic 将是线程安全的。

使用 atomic 是同步从多个线程使用的 属性 的一种方法。但是有很多机制可以同步来自多个线程的访问,atomic 是一种实用性相当有限的机制。我建议您参考 线程编程指南 Synchronization 章节以更全面地讨论备选方案(甚至没有讨论其他当代模式,例如 GCD 串行队列和 reader-writer pattern with a custom, concurrent queue).

最重要的是,atomic 本身对于确保线程安全既不是必要的也不是充分的。通常,它在处理一些简单的基本数据类型(布尔值、NSInteger)时的实用性有限,但在处理更复杂的逻辑或处理可变对象时就不够用了。

简而言之,不要假设您在使用 GCD 时就应该使用 atomic。事实上,如果您使用 GCD,通常就不需要 atomic,这实际上会不必要地影响与 GCD 一起使用的性能。所以,如果你有一些 属性 被多个线程访问,你应该同步它,但是选择使用哪种同步技术取决于特定情况的具体细节,而 GCD 通常是一个更高性能和更完整的解决方案。