- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"1"); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"2"); }); NSLog(@"3"); }
上面的代碼只會打印1 然會就會線程卡死,這是爲何呢?ui
由於dispatch_get_main_queue()獲得的是一個串行隊列,串行隊列的特色: 一次只調度一個任務,隊列中的任務一個接着一個地執行(一個任務執行完畢後,再執行下一個任spa
務)線程
同步(sync) 操做,它會阻塞當前線程並等待 Block 中的任務執行完畢,而後當前線程纔會繼續往下運行code
viewDidLoad 在主線程中,也即dispatch_get_main_queue()中,執行到sync時向dispatch_get_main_queue()插入同步thread,sync會等到後面的block執行完成才返回。sync又隊列
在主隊列裏面,是個串行隊列,sync是後面才加入的,前面一個是主線程viewDidLoad,因此sync想執行block必須等待前一個主線程viewDidLoad執行完成,而主線程get
viewDidLoad卻在等待sync返回,才能去執行後續工做,從而形成死鎖同步