串行与并行针对的是队列,而异步与同步针对的是线程。最大的区别在于,同步线程要阻塞当前线程,必须要等待同步线程中的任务执行完,返回以后,才能继续执行下一任务;而异步线程则不用等待。
死锁:
例如:
NSLog(@"1"); // 任务1
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2"); // 任务2
});
NSLog(@"3"); // 任务3
控制台输出:
首先执行任务1,这是肯定没问题的,
只是接下来,程序遇到了同步线程,那么它会进入
等待,等待任务2执行完,然后执行任务3。
但这是队列,有任务来,当然会将任务加到队尾,
然后遵循FIFO原则执行任务。那么,现在任务2就
会被加到最后,任务3排在了任务2前面,问题来了:
任务3要等任务2执行完才能执行,
任务2由排在任务3后面,
意味着任务2要在任务3执行完才能执行,
所以他们进入了互相等待的局面。
【既然这样,那干脆就卡在这里吧】
这就是死锁。