dispatch_sync先上两个概念:
一、队列:(只是提供是否可以开启多线程的环境条件)
1、串行队列
2、并行队列
3、主队列(每个应用对应唯一一个主队列)
4、全局队列(系统的并行队列)
二、任务:(真正决定要不要开启多线程)
1、同步执行(不可开新线程)
2、异步执行(可以开新线程)
以售票厅售票排队的事情为例
如果有一个三个窗口的售票厅,窗口相当于队列,同时开放相当于并行队列,也就是可以支持同时三个窗口售票,只开放一个窗口相当于串行队列
1号窗口 2号窗口 3号窗口
旅游团A(A1,A2,A3)
旅游团B(B1,B2)
旅游团C(C1,C2,C3)
当同步执行的时候,各个旅游团不可以分散排队,只能排到某一个窗口下进行依次买票,各个旅游团的人也要按照顺序进行买票,也就是A1--A2--A3---B1----B2----C1---C2---C3
当异步执行的时候,各个旅游团可以分散排队,但是旅游团内部仍需要按照顺序进行买,也就是可以旅游团A排1,旅游团B排3,旅游团C排2,三个窗口同时开启售票,此时,旅游团A的三个人肯定是一个线程,团B两个人是一个线程,旅游团C三个人是一个线程,所以打印出来的顺序可能是A1 B1 C1 A2 C2 B2 A3 C3,但是中注意各旅游团内部是按照顺序执行的
三、下面来分几种情况:
1、并行队列+同步执行
解析:
并行队列--->开了三个窗口
同步执行----->只能三个旅游团排到一个窗口下面依次买票,所以一切需要按照顺序买票,各团内部也是按照顺序买票
2、并行队列+异步执行
解析:
并行队列--->开了三个窗口
异步执行--->可以以旅游团为单位,进行分散买票,但各旅游团内部需要按照顺序买票
3、串行队列+同步执行
解析:
串行队列--->只开了一个窗口
同步执行---->只能三个旅游团排到一个窗口下面依次买票,所以一切需要按照顺序买票,各团内部也是按照顺序买票
4、串行队列+异步执行
解析:
串行队列--->只开了一个窗口
异步执行---->可以以旅游团为单位,进行分散买票,但很遗憾,只有一个窗口是开着的,所以还是乖乖在这排着吧,所以结果是按照顺序一个一个买
5、主队列+同步执行
解析:
主队列--->相当于串行队列,只开了一个窗口
同步执行---->只能三个旅游团排到一个窗口下面依次买票,所以一切需要按照赵顺序买票,此时要注意,这里会产生死锁,在下面会讲
6、主队列+异步执行
解析:
主队列--->相当于串行队列,只开了一个窗口
异步执行---->可以以旅游团为单位,进行分散买票,但是很遗憾,只有一个窗口是开着的,所以还是乖乖在这排着吧,所以结果是按照顺序一个一个买
四、死锁的概念
先上一个代码
-(void)syncMain {
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"同步里面的")
})
}
队列是采取先进先出的方式,在主队列里,方法syncMain先被压进了栈,然后又压了dispatch_sync这个方法,主队列需要先把syncMain执行完,才能执行dispatch_sync里面的方法,但是 dispatch_sync是在syncMain方法里面同步执行,syncMain方法需要等待dispatch_sync这个方法执行了才能往下进行,可是dispatch_sync又需要等待syncMain方法执行完他才能被队列送出执行,所以就造成了互相等待的死锁状态