這是一道面試題!??!
下面這段代碼的執(zhí)行結(jié)果是什么呢?自己動手試試吧
dispatch_queue_t queue = dispatch_queue_create("test.queue", nil);
dispatch_sync(queue, ^{
NSLog(@"111");
dispatch_sync(queue, ^{
NSLog(@"222");
});
NSLog(@"333");
});
對,結(jié)果就是APP掛掉了~哈哈哈哈哈哈
言歸正傳吧還是- -!
dispatch_queue_t queue = dispatch_queue_create("test.queue", nil);
創(chuàng)建了一個名稱為test.queue的串行隊列(第二個參數(shù)為nil,創(chuàng)建的是serial)。
1.將dispatch_sync整體加入到主線程隊列中
2.執(zhí)行sync,將111,sync,222加入到queue隊列中,因為是個串行隊列,所以需要一步一步執(zhí)行。
打印111沒問題,然后,就沒有然后了。
queue的隊列中 現(xiàn)在queue的隊列
NSLog(@"111") | | NSLog(@"111")
dispatch_sync() | |dispatch_sync()
NSLog(@"333")| |NSLog(@"333")
| NSLog(@"222") block任務(wù)加到隊末尾
因為是串行按順序執(zhí)行的 NSLog(@"333"),在等著sync的執(zhí)行,而NSLog(@"222")在等著NSLog(@"333")的執(zhí)行,結(jié)果就是誰也別執(zhí)行了,這就是同步死鎖。。。。。。。。