- (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返回,才能去执行后续工做,从而形成死锁同步