面试题
1.以下代码会发生什么情况
//Situation 1:
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"NSTREAD-----%@",[NSThread currentThread]);
});
//Situation 2:
dispatch_queue_t queue = dispatch_queue_create("test", nil);
dispatch_sync(queue, ^ {
NSLog(@"NSTREAD-----%@",[NSThread currentThread]);
dispatch_sync(queue, ^ {
NSLog(@"NSTREAD-----%@",[NSThread currentThread]);
});
});
Stituation1
当前队列是主队列 `dispatch_get_main_queue()` 而主队列是串行队列。
当前queue上调用sync函数,并且sync函数中指定的queue也是当前queue。
需要执行的block被放到当前queue的对列尾部等待执行,
因为这是一个串行的queue,调用sync函数会阻塞当前队列,
等待block执行 -> 这个block因为永远没有机会执行 -> sync函数不返回,
所以当前队列就永远被阻塞了,这就造成了死锁。
Stituation2
当前队列是队列 'dispatch_queue_create("test", nil)' ,函数的第二个参数为nil,
则默认是DISPATCH_QUEUE_SERIAL串行队列。
由于外层sync指定了当前queue,内层sync也指定了当前queue,
这种情况类似Stituation1的情况,死锁的原因相同。