如果我们使用 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 通常是一个更高性能和更完整的解决方案。
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 通常是一个更高性能和更完整的解决方案。