先上代码
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%@",[NSThread currentThread]);
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"sync----%@",[NSThread currentThread]);
});
NSLog(@"%@",[NSThread currentThread]);
}
控制台输出
我们可以看到控制台只打印输出了第一个log,第二和第三个log为什么没有走进来呢?这是因为当前线程为主线程,而主线程默认都是串行队列(串行队列都是先进先出,一步一步执行的),当你用gcd创建一个同步任务时,并没有开辟一个子线程所以只有当gcd的同步块走完以后才会走第三个log输出,而当他走gcd的同步任务时,此任务又让回到主线程执行任务(dispatch_get_main_queue),主线程又是串行的 所以只有当主线程执行完成以后才会走block里面的任务,从而出现了主线程让gcd先走,而gcd又让主线程先走导致冲突,引起了主线程的锁死。