有人可以概述这3个系统在线程安全方面的优缺点吗?
通过观看更近期的WWDC视频,我感觉Apple正在推动使用GCD来创建线程安全的高性能读写器。
这背后的想法/支持是什么?是时候访问必须进入导致此GCD推送的内核的锁,并回避@synchronized和NSLock?
@synchronized和NSLock是否被推出了最佳实践,或者还有它们的位置?
答案 0 :(得分:5)
有许多细节可以就此进行详细讨论。但是,核心:
这些总是需要在某处或以某种方式锁定:
@synchronized(...) { ... }
[lock lock];
由于你提到的原因,锁是非常昂贵的;他们必然消耗内核资源。 (@synchronized()案例实际上可能会避免内核锁定,但它是一种基于散列的排除机制,而且本身也很昂贵。)
这些并不总是需要锁定(但有时可能会这样做):
dispatch_sync(...concurrent q...., ^{ ... });
dispatch_async(...queue of any kind...., ^{ ... });
通过调度函数有一条快速路径可以实现无锁(尽管它们将使用可能导致负载下性能问题的测试和设置原子基元)。
最终结果是对并发队列的同步调度可以有效地被视为“立即在此线程上执行此操作”。对串行队列的同步调度可以进行原子测试和设置,以测试队列是否处理,将其标记为忙,如果不忙,则立即执行调用线程上的块。
异步调度可以同样快,但异步调度需要复制块(这可能非常便宜,但需要考虑)。
一般来说,GCD可以做任何锁可以做的事情,至少可以做到 - 如果不是更多 - 有效,你可以使用GCD API超越简单的锁定(使用信号量作为计算)油门,例如)。
BTW:如果您的任务比较粗糙,请查看NSOperationQueue
和NSOperation
。