死锁场景:
- 任务互相等待
- 不正确的加锁
任务等待
先看区别:
- 同步/异步
同步指不开启新线程,在当前线程等待执行任务
异步指无需等待即可开始执行 - 串行/并行
串行是指所有任务需要依次执行的队列,比如主线程
并行是指所有任务无需等待任何时候都可执行的队列,比如全局队列
因此:
串行队列里执行了 同步任务,会引起死锁,比如:
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"test");
});
NSLog(@"test1");
}
其中test1需要等待test执行完成,test需要等主线程执行完成
其它场景:
串行队列执行异步任务,会通过CPU异步动作将任务插队执行,不保证执行顺序,不一定开启新线程
并行队列执行同步任务,会在当前线程按顺序执行,和不加入队列执行一样,也没什么意义
并行队列执行异步任务,会开启新线程来执行多个任务,也是平时使用的最多场景
错误加锁
特指互斥锁,在一个锁未解锁的情况下 再次加锁,就会出现互相持有不能继续的情况,可将锁改为递归锁解决问题
网友评论