多用派发队列,少用同步锁

来源 ——《Effective Objective-C 2.0 》Matt Galloway

在OC中,如果有多个线程要执行同一份代码,那么有时可能会出现问题。这种情况下,通常要使用锁来实现某种同步机制。在GCD出现之前,有两种方法,第一种是采用同步块(synchronization block):

这种写法会根据给定的对象,自动创建一个锁,并等待块中的代码执行完毕。执行到这段代码结尾处,锁就释放了。在本例中,同步行为所针对的对象是self。这样写通常没错,因为它可以保证每个对象实例都能不受干扰地运行其synchronizedMethod。然而,滥用@synchronized(self)则会降低代码效率,因为公用同一个锁的那些同步块,都必须按顺序执行。若是在self对象上频繁加锁,那么程序可能要等另一段与此无关的代码执行完毕,才能继续执行当前代码,这样做其实并没有必要。

另一个方法是直接使用NSLock对象:

也可以使用NSRecursiveLock这种”递归锁”(recursive lock),线程能够多次持有该锁,而不会出现死锁(deadlock)现象。
这两种方法都很好,不过也有其缺陷。比方说,在极端情况下,同步锁会导致死锁,另外,其效率也不见得很高,而如果直接使用锁对象的话,一旦遇到死锁,就会变得非常麻烦。 继续阅读多用派发队列,少用同步锁

iOS多线程GCD的使用

1.什么是GCD
GCD是Grand Central Dispatch的缩写,是苹果公司开发的一种基于block的并行操作机制。它由两部分组成,一是FIFO队列,二个是线程池,队列添加任务,线程池执行任务。其中FIFO队列称为dispatch queue,这保证了先进来的任务先得到执行,但不保证先结束。
dispatch queue分为下面两种:
第一种,Serial Dispatch Queue,线程池只提供一个线程,所以后一个线程必须等到前一个前程执行结束才能开始,顺序执行。
第二种,Concurrent Dispatch Queue,线程池提供多个线程,所以可以按照顺序启动多个线程,并发执行。 继续阅读iOS多线程GCD的使用