dispatch_sync先上兩個概念:
一、隊列:(只是提供是否可以開啟多線程的環(huán)境條件)
1改艇、串行隊列
2兰粉、并行隊列
3、主隊列(每個應用對應唯一一個主隊列)
4恋昼、全局隊列(系統(tǒng)的并行隊列)
二看靠、任務:(真正決定要不要開啟多線程)
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í)行---->可以以旅游團為單位诗舰,進行分散買票警儒,但很遺憾,只有一個窗口是開著的眶根,所以還是乖乖在這排著吧蜀铲,所以結果是按照順序一個一個買
5、主隊列+同步執(zhí)行
解析:
主隊列--->相當于串行隊列属百,只開了一個窗口
同步執(zhí)行---->只能三個旅游團排到一個窗口下面依次買票记劝,所以一切需要按照趙順序買票,此時要注意族扰,這里會產(chǎn)生死鎖厌丑,在下面會講
6、主隊列+異步執(zhí)行
解析:
主隊列--->相當于串行隊列别伏,只開了一個窗口
異步執(zhí)行---->可以以旅游團為單位蹄衷,進行分散買票忧额,但是很遺憾厘肮,只有一個窗口是開著的,所以還是乖乖在這排著吧睦番,所以結果是按照順序一個一個買
四类茂、死鎖的概念
先上一個代碼
-(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)