iOS中对串行并行以及同步异步的理解

面试题
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的情况,死锁的原因相同。

主队列和主线程

推荐阅读更多精彩内容