dispatch_sync先上兩個概念:
一、隊列:(只是提供是否可以開啟多線程的環(huán)境條件)
1、串行隊列
2、并行隊列
3、主隊列(每個應(yīng)用對應(yīng)唯一一個主隊列)
4、全局隊列(系統(tǒng)的并行隊列)
二、任務(wù):(真正決定要不要開啟多線程)
1、同步執(zhí)行(不可開新線程)
2、異步執(zhí)行(可以開新線程)
以售票廳售票排隊的事情為例
如果有一個三個窗口的售票廳,窗口相當于隊列,同時開放相當于并行隊列,也就是可以支持同時三個窗口售票,只開放一個窗口相當于串行隊列
1號窗口 2號窗口 3號窗口
旅游團A(A1,A2,A3)
旅游團B(B1,B2)
旅游團C(C1,C2,C3)
當同步執(zhí)行的時候,各個旅游團不可以分散排隊,只能排到某一個窗口下進行依次買票,各個旅游團的人也要按照順序進行買票,也就是A1--A2--A3---B1----B2----C1---C2---C3
當異步執(zhí)行的時候,各個旅游團可以分散排隊,但是旅游團內(nèi)部仍需要按照順序進行買,也就是可以旅游團A排1,旅游團B排3,旅游團C排2,三個窗口同時開啟售票,此時,旅游團A的三個人肯定是一個線程,團B兩個人是一個線程,旅游團C三個人是一個線程,所以打印出來的順序可能是A1 B1 C1 A2 C2 B2 A3 C3,但是中注意各旅游團內(nèi)部是按照順序執(zhí)行的
三、下面來分幾種情況:
1、并行隊列+同步執(zhí)行
解析:
并行隊列--->開了三個窗口
同步執(zhí)行----->只能三個旅游團排到一個窗口下面依次買票,所以一切需要按照順序買票,各團內(nèi)部也是按照順序買票
2、并行隊列+異步執(zhí)行
解析:
并行隊列--->開了三個窗口
異步執(zhí)行--->可以以旅游團為單位,進行分散買票,但各旅游團內(nèi)部需要按照順序買票
3、串行隊列+同步執(zhí)行
解析:
串行隊列--->只開了一個窗口
同步執(zhí)行---->只能三個旅游團排到一個窗口下面依次買票,所以一切需要按照順序買票,各團內(nèi)部也是按照順序買票
4、串行隊列+異步執(zhí)行
解析:
串行隊列--->只開了一個窗口
異步執(zhí)行---->可以以旅游團為單位,進行分散買票,但很遺憾,只有一個窗口是開著的,所以還是乖乖在這排著吧,所以結(jié)果是按照順序一個一個買
5、主隊列+同步執(zhí)行
解析:
主隊列--->相當于串行隊列,只開了一個窗口
同步執(zhí)行---->只能三個旅游團排到一個窗口下面依次買票,所以一切需要按照趙順序買票,此時要注意,這里會產(chǎn)生死鎖,在下面會講
6、主隊列+異步執(zhí)行
解析:
主隊列--->相當于串行隊列,只開了一個窗口
異步執(zhí)行---->可以以旅游團為單位,進行分散買票,但是很遺憾,只有一個窗口是開著的,所以還是乖乖在這排著吧,所以結(jié)果是按照順序一個一個買
四、死鎖的概念
先上一個代碼
-(void)syncMain {
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"同步里面的")
})
}
隊列是采取先進先出的方式,在主隊列里,方法syncMain先被壓進了棧,然后又壓了dispatch_sync這個方法,主隊列需要先把syncMain執(zhí)行完,才能執(zhí)行dispatch_sync里面的方法,但是 dispatch_sync是在syncMain方法里面同步執(zhí)行,syncMain方法需要等待dispatch_sync這個方法執(zhí)行了才能往下進行,可是dispatch_sync又需要等待syncMain方法執(zhí)行完他才能被隊列送出執(zhí)行,所以就造成了互相等待的死鎖狀態(tài)