iOS同步異步和隊列的通俗理解

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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容