面試題
請問以下代碼打印結果:
- (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這個地方,雙方相互等待,形成了死鎖。