这是一道面试题!!!
下面这段代码的执行结果是什么呢?自己动手试试吧
dispatch_queue_t queue = dispatch_queue_create("test.queue", nil);
dispatch_sync(queue, ^{
NSLog(@"111");
dispatch_sync(queue, ^{
NSLog(@"222");
});
NSLog(@"333");
});
对,结果就是APP挂掉了~哈哈哈哈哈哈
言归正传吧还是- -!
dispatch_queue_t queue = dispatch_queue_create("test.queue", nil);
创建了一个名称为test.queue的串行队列(第二个参数为nil,创建的是serial)。
1.将dispatch_sync整体加入到主线程队列中
2.执行sync,将111,sync,222加入到queue队列中,因为是个串行队列,所以需要一步一步执行。
打印111没问题,然后,就没有然后了。
queue的队列中 现在queue的队列
NSLog(@"111") | | NSLog(@"111")
dispatch_sync() | |dispatch_sync()
NSLog(@"333")| |NSLog(@"333")
| NSLog(@"222") block任务加到队末尾
因为是串行按顺序执行的 NSLog(@"333"),在等着sync的执行,而NSLog(@"222")在等着NSLog(@"333")的执行,结果就是谁也别执行了,这就是同步死锁。。。。。。。。