先上代碼
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%@",[NSThread currentThread]);
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"sync----%@",[NSThread currentThread]);
});
NSLog(@"%@",[NSThread currentThread]);
}
控制臺輸出

我們可以看到控制臺只打印輸出了第一個log,第二和第三個log為什么沒有走進來呢?這是因為當前線程為主線程,而主線程默認都是串行隊列(串行隊列都是先進先出,一步一步執(zhí)行的),當你用gcd創(chuàng)建一個同步任務(wù)時,并沒有開辟一個子線程所以只有當gcd的同步塊走完以后才會走第三個log輸出,而當他走gcd的同步任務(wù)時,此任務(wù)又讓回到主線程執(zhí)行任務(wù)(dispatch_get_main_queue),主線程又是串行的 所以只有當主線程執(zhí)行完成以后才會走block里面的任務(wù),從而出現(xiàn)了主線程讓gcd先走,而gcd又讓主線程先走導(dǎo)致沖突,引起了主線程的鎖死。