同步队列

GCD之同步锁和派发队列

你说的曾经没有我的故事 提交于 2019-12-07 15:19:44
在OC中,如果有多个线程要执行同一份代码,那么就可能会出现问题.(比如出现读写不一致的情况)这种情况下通常需要使用锁来实现某种同步机制.在GCD 出现之前,有两种办法,第一种是使用内置的同步块 synchronization block - (void)synchronizedMethod { @synchronized(self) { // } } 这种写法会根据给定的对象自动创建一个锁,并等到块中的代码执行完毕.执行到代码结尾处,锁就会自动释放. 需要注意的是:滥用@synchronized(self)会降低代码的执行效率,因为公用一个锁的那些同步块必须按照顺序执行.若是在self上频繁加锁,那么程序可能要等待另一段无关的代码执行完毕才能继续执行当前的代码. 另一方法是直接使用 NSLock对象. _lock = [[NSLock alloc] init]; - (void)synchronizedMethod_lock { [_lock lock]; // safe [_lock unlock]; } 这两种方法都很好,但是也有缺陷.比如:极端情况下,同步块会导致死锁,而且性能也不见得高效,而如果直接使用锁对象的话,一旦遇上死锁将会非常难处理. 替代方案就是使用GCD,他能以更简单 更高效的形式为代码加锁. 比如说属性就是开发者经常需要同步的地方,这种属性需要做成原子的 .