(一)各种队列的执行效果
1.常见的多线程方案 2.同步和异步的主要影响:能不能开启新的线程 同步:在当前的线程中执行任务,不具备开启新线程的能力 异步:在新的线程中开启任务,具备开启新线程的能力
3.并发和串行的主要影响:任务的执行方式 并发:多个任务并发(同时)执行 串行:一个任务执行完毕之后,再执行下个任务 队列的类型包括: 并发队列,串行队列,主队列(也是一个串行队列) 决定了任务的执行方式(并发,串行)
(二)常见的死锁案例
使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列(产生死锁)
1.产生死锁
NSLog(@"任务1");
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
NSLog(@"任务2");
});
NSLog(@"任务3");
2.不会产生死锁
NSLog(@"任务1");
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{
NSLog(@"任务2");
});
NSLog(@"任务3");
3.产生死锁(sync并且是串行队列粗体文本)
NSLog(@"任务1");
dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
NSLog(@"任务2");
dispatch_sync(queue, ^{
NSLog(@"任务3");
});
NSLog(@"任务4");
});
NSLog(@"任务5");
4.不会产生死锁(不是同一个队列)
NSLog(@"任务1");
dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue2 = dispatch_queue_create("myqueue2", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
NSLog(@"任务2");
dispatch_sync(queue2, ^{
NSLog(@"任务3");
});
NSLog(@"任务4");
});
NSLog(@"任务5");
5.不产生死锁(并发队列)
NSLog(@"任务1");
dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"任务2");
dispatch_sync(queue, ^{
NSLog(@"任务3");
});
NSLog(@"任务4");
});
NSLog(@"任务5");