面试题
请问以下代码打印结果:
- (void)interview01 { // 以下代码是在主线程执行的 NSLog(@"执行任务1"); dispatch_queue_t queue = dispatch_get_main_queue(); dispatch_sync(queue, ^{ NSLog(@"执行任务2"); }); NSLog(@"执行任务3"); }
答案:没有打印,会产生死锁
原因:
判断是否死锁,由两个因素决定:
1、在当前线程同步执行任务还是异步执行任务
2、队列的类型,决定了任务的执行方式
上面这个例子,是个经典的死锁问题,interview01这个任务是在主线程执行,dispatch_sync会立马在当前线程(主线程)同步执行任务,也就是说dispatch_sync中的block需要立即执行完毕之后代码才会继续往下走,而主线程是在主队列调度任务,此时调度的是interview01这个任务,主队列(特殊的串行队列),interview01这个任务没有执行完就无法调度其他任务,所以dispatch_sync中的block在等interview01任务,而interview01这个任务又卡在了dispatch_sync这个地方,双方相互等待,形成了死锁。