結論:使用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進階視頻,感興趣可看一看:觀看地址