结论:使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列(产生死锁)bash
首先你要理解同步和异步执行的概念,同步和异步目的不是为了是否建立一个新的线程,同步会阻塞当前函数的返回,异步函数会当即返回执行下面的代码;队列是一种数据结构,队列有FIFO,LIFO等,控制任务的执行顺序,至因而否开辟一个新的线程,由于同步函数会等待函数的返回,因此在当前线程执行就好了,不必浪费资源再开辟新的线程,若是是异步函数,当前线程须要当即函数返回,而后往下执行,因此函数里面的任务必需要开辟一个新的线程去执行这个任务。数据结构
队列上是听任务的,而线程是去执行队列上的任务的异步
【问题1】:如下代码是在主线程执行的,会不会产生死锁?会!async
NSLog(@"执行任务1");
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"执行任务2");
});
NSLog(@"执行任务3");
复制代码
dispatch_sync立马在当前线程同步执行任务函数
分析:ui
其中在主队列viewDidLoad里面的任务3执行结束才会执行任务2;而主线程中是执行完sync才会执行任务3。也就是任务2等待任务3执行,任务3再也等待任务2执行,形成死锁spa
【问题2】:如下代码是在主线程执行的,会不会产生死锁?不会!线程
- (void)interview02
{
NSLog(@"执行任务1");
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
NSLog(@"执行任务2");
});
NSLog(@"执行任务3");
// dispatch_async不要求立马在当前线程同步执行任务
}
复制代码
由于dispatch_async不要求立马在当前线程同步执行任务,不会形成线程死锁3d
【问题3】:如下代码是在主线程执行的,会不会产生死锁?会!code
NSLog(@"执行任务1");
dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{ // 0
NSLog(@"执行任务2");
dispatch_sync(queue, ^{ // 1
NSLog(@"执行任务3");
});
NSLog(@"执行任务4");
});
NSLog(@"执行任务5");
复制代码
其中执行任务3
和执行任务4
之间形成死锁
【问题4】:如下代码是在主线程执行的,会不会产生死锁?不会!
- (void)interview04
{
NSLog(@"执行任务1");
dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{ // 0
NSLog(@"执行任务2");
dispatch_sync(queue, ^{ // 1
NSLog(@"执行任务3");
});
NSLog(@"执行任务4");
});
NSLog(@"执行任务5");
}
复制代码
推荐个不错的iOS进阶视频,感兴趣可看一看:观看地址