先上代碼
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%@",[NSThread currentThread]);
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"sync----%@",[NSThread currentThread]);
});
NSLog(@"%@",[NSThread currentThread]);
}
控制臺(tái)輸出
我們可以看到控制臺(tái)只打印輸出了第一個(gè)log,第二和第三個(gè)log為什么沒(méi)有走進(jìn)來(lái)呢?這是因?yàn)楫?dāng)前線程為主線程,而主線程默認(rèn)都是串行隊(duì)列(串行隊(duì)列都是先進(jìn)先出,一步一步執(zhí)行的)拇派,當(dāng)你用gcd創(chuàng)建一個(gè)同步任務(wù)時(shí),并沒(méi)有開(kāi)辟一個(gè)子線程所以只有當(dāng)gcd的同步塊走完以后才會(huì)走第三個(gè)log輸出凿跳,而當(dāng)他走gcd的同步任務(wù)時(shí)件豌,此任務(wù)又讓回到主線程執(zhí)行任務(wù)(dispatch_get_main_queue),主線程又是串行的 所以只有當(dāng)主線程執(zhí)行完成以后才會(huì)走block里面的任務(wù)控嗜,從而出現(xiàn)了主線程讓gcd先走茧彤,而gcd又讓主線程先走導(dǎo)致沖突,引起了主線程的鎖死疆栏。