在同一个线程里面,调用同一个串行队列会发生死锁现象
//发生死锁
-(void)oneTest
{
NSLog(@"1");//任务1
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");//任务2
});
NSLog(@"3");//任务3
//首先会执行任务1毫无疑问,然后程序遇到了同步线程,任务三要等待同步线程执行完再执行,而主线程是一个特殊的串行对了。遵循FIFO原则来执行任务,然后任务二被加在任务三的后面要等待任务三完成才执行,这样就进入了互相等待的局面。
}
//不会死锁
-(void)twoTest
{
NSLog(@"1");//任务1
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0), ^{
NSLog(@"2");//任务2
});
NSLog(@"3");//任务3
//毫无疑问首先执行任务一,然后遇到了同步线程,任务三要等待同步线程执行完再执行,然后任务二被加在了子线程,在子线程执行完任务二然后回到主线程继续执行任务三
}
//发生死锁
-(void)threeTest
{
dispatch_queue_t queue = dispatch_queue_create("com.GCD.serial", DISPATCH_QUEUE_SERIAL);
NSLog(@"1");//任务1
dispatch_async(queue, ^{
NSLog(@"2");//任务2
dispatch_sync(queue, ^{
NSLog(@"3");//任务3
});
NSLog(@"4");//任务4
});
NSLog(@"5");//任务5
//首先,执行任务一,毫无疑问,然后遇到异步线程操作,任务5不必等一步线程操作完再执行,所以任务2和任务5执行先后不一定,二异步操作dispatch_async(queue,^{})中是串行队列操作DISPATCH_QUEUE_SERIAL,任务二和任务四与任务三依次执行,而任务三在同步队列中,任务四又要等任务三执行完再执行,这样就造成了任务三和任务四互相等待的结局,死锁
}
//不会死锁
-(void)fourTest
{
NSLog(@"1");//任务1
dispatch_async(dispatch_get_global_queue(0,0), ^{
NSLog(@"2");//任务2
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"3");//任务3
});
NSLog(@"4");//任务4
});
NSLog(@"5");//任务5
//显然,首先执行任务1,然后遇到异步全局队列,所以异步队列和任务5同时执行,不分先后,然后异步队列中先执行任务2,遇到同步主队列,任务4要等任务3完成之后执行,而任务3和任务4四不在一个队列里,所以任务3不必等待任务4的完成。所以,整个案例的执行结果是:15234或者12534
}
//发生死锁
-(void)fiveTest
{
dispatch_sync(dispatch_get_global_queue(0,0), ^{
NSLog(@"1");//任务1
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");//任务2
});
NSLog(@"3");//任务3
});
NSLog(@"4");//任务4
while (1) {
}
NSLog(@"5");//任务5
//首先是异步线程,任务4不用等待任务1的执行,同时执行,所以任务1和任务4肯定能执行到,顺序不一定,然后任务4之后遇到死循环不再往下执行任务5,而异步队列中任务2又被加入了串行主队列任务5的后面,所以任务2也不会执行,而任务1在之前之后遇到同步操作,任务3要等待任务2结束后再执行,所以任务3也不会执行,因此最后结果是1 4或者4 1。
}
//发生死锁
-(void)sixTest
{
NSLog(@"1");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"2");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"3");
});
NSLog(@"4");
});
NSLog(@"5");
}
//发生死锁
-(void)sevenTest
{
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"3");
});
NSLog(@"4");
});
NSLog(@"5");
}