這里先分清兩個概念:Queue 和 Async逛犹、Sync。
Queue(隊列):隊列分為串行和并行梁剔。串行隊列上面你按照A虽画、B、C荣病、D的順序添加四個任務(wù)码撰,這四個任務(wù)按順序執(zhí)行,結(jié)束順序也肯定是A个盆、B脖岛、C朵栖、D。而并行隊列上面這四個任務(wù)同時執(zhí)行柴梆,完成的順序是隨機的陨溅,每次都可能不一樣。
Async VS Sync(異步執(zhí)行和同步執(zhí)行):使用dispatch_async 調(diào)用一個block绍在,這個block會被放到指定的queue隊尾等待執(zhí)行门扇,至于這個block是并行還是串行執(zhí)行只和dispatch_async參數(shù)里面指定的queue是并行和串行有關(guān)。但是dispatch_async會馬上返回偿渡。
使用dispatch_sync 同樣也是把block放到指定的queue上面執(zhí)行悯嗓,但是會等待這個block執(zhí)行完畢才會返回,阻塞當(dāng)前queue直到sync函數(shù)返回卸察。
所以隊列是串行脯厨、并行 和 同步、異步執(zhí)行調(diào)用block是兩個完全不一樣的概念坑质。這兩個概念清楚了之后就知道為什么死鎖了合武。
分析上面的原因:
在主線程中通過Sync方式把block加入到主線程隊列,那么當(dāng)前線程(主線程)就會被阻塞涡扼,等待block執(zhí)行完畢后回調(diào)稼跳,而blcok被加入了主線程隊列中,主線程隊列又是一個串行隊列吃沪,那么block的執(zhí)行就需要等待主線程執(zhí)行完前面的任務(wù)后才能被執(zhí)行汤善,這樣的相互等待狀態(tài)產(chǎn)生了死鎖,block永遠(yuǎn)沒有機會執(zhí)行票彪。
如果執(zhí)行上面語句的線程不是主線程則不會造成死鎖红淡,如下圖: