1:
- (void)viewDidLoad {
//dispatch_sync(dispatch_get_main_queue(), ^{
//NSLog(@3);
//死鎖原因
//1:dispatch_sync在等待block語句執行完成,而block語句需要在主線程裡執行,所以dispatch_sync如果在主線程調用就會造成死鎖
//2:dispatch_sync是同步的,本身就會阻塞當前線程,也即主線程。而又往主線程裡塞進去一個block,所以就會發生死鎖。
//});
//dispatch_async(dispatch_get_global_queue(), ^{
//async 在主線程中 創建了一個異步線程 加入 全局並發隊列,async 不會等待block 執行完成,立即返回
NSLog(@2);//不會造成死鎖;
});
}
分析這段代碼:view DidLoad 在主線程中,也即dispatch_get_main_queue()中,執行到sync時向dispatch_get_main_queue()插入同步thread,sync會等到後面的block執行完成才返回。sync又在主隊列裡面,是個串行隊列,sync是後面才加入的,前面一個是主線程,所以sync想執行block必須等待前一個主線程執行完成,而主線程卻
在等待sync返回,去執行後續工作,從而造成死鎖。
2:
dispatch_sync 和 dispatch_async 區別:
dispatch_async(queue,block) async 異步隊列,dispatch_async
函數會立即返回, block會在後台異步執行。
dispatch_sync(queue,block) sync 同步隊列,dispatch_sync
函數不會立即返回,即阻塞當前線程,等待 block同步執行完成。
3:
GCD Queue 分為三種:
1,The main queue :主隊列,主線程就是在個隊列中。
2,Global queues : 全局並發隊列。
3,用戶隊列:是用函數 dispatch_queue_create
創建的自定義隊列