文章目录
  1. 1. 1.第一种情况:dispatch_sync(dispatch_get_main_queue(), ^{}引起死锁
  2. 2. 2.第二种情况:
  3. 3. 3.第三种情况,死循环

1.第一种情况:dispatch_sync(dispatch_get_main_queue(), ^{}引起死锁

NSLog输出1后,主队列的同步线程,按照FIFO的原则(先入先出),2排在3后面会等3执行完,但因为同步线程,3又要等2执行完,相互等待成为死锁。

  • (void)deadLockCase1 {

    NSLog(@”1”);

dispatch_sync(dispatch_get_main_queue(), ^{

  NSLog(@"2");

});

 NSLog(@"3");

}
解决办法:把同步线程放在全局队列里,即可解决。

  • (void)deadLockCase2 {

NSLog(@”1”);

//3会等2,因为2在全局并行队列里,不需要等待3,这样2执行完回到主队列,3就开始执行

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

NSLog(@”2”);

});

NSLog(@”3”);

}

2.第二种情况:

  • (void)deadLockCase2 {

dispatch_queue_t serialQueue = dispatch_queue_create(“com.starming.gcddemo.serialqueue”, DISPATCH_QUEUE_SERIAL);

NSLog(@”1”);

dispatch_async(serialQueue, ^{//异步线程

NSLog(@”2”);

//串行队列里面同步一个串行队列就会死锁

dispatch_sync(serialQueue, ^{

NSLog(@”3”);

});

NSLog(@”4”);

});

NSLog(@”5”);

}
打印结果:1,5,2

解决办法:

  • (void)deadLockCase4 {

NSLog(@”1”);

dispatch_async(dispatch_get_global_queue(0, 0), ^{

NSLog(@”2”);

//将同步的串行队列放到另外一个线程就能够解决

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@”3”);

});

NSLog(@”4”);

});

NSLog(@”5”);

}

3.第三种情况,死循环

  • (void)deadLockCase3 {

dispatch_async(dispatch_get_global_queue(0, 0), ^{

NSLog(@”1”);

//回到主线程发现死循环后面就没法执行了

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@”2”);

});

NSLog(@”3”);

});

NSLog(@”4”);

//死循环

while (1) {

//

}
}

打印结果:4,1

文章目录
  1. 1. 1.第一种情况:dispatch_sync(dispatch_get_main_queue(), ^{}引起死锁
  2. 2. 2.第二种情况:
  3. 3. 3.第三种情况,死循环
Fork me on GitHub