寫了一段gcd產(chǎn)生死鎖的代碼穗慕,其實早就見過這種代碼了若未,記得當時,不理解,現(xiàn)在想想磷斧,這還是特別好理解的.
代碼1:
-(void)gcdSyncTest
{
? ? ? ?dispatch_queue_t serialQueue = dispatch_queue_create("com.test", DISPATCH_QUEUE_SERIAL);
? ? ?//任務1
? ? ? dispatch_sync(serialQueue, ^{
? ? ?//任務2
? ? ? dispatch_sync(serialQueue, ^{
? ? ? NSLog(@"hehe");
? ? ? ? });
? ? });
}
其實以上代碼和以下代碼 原理相同 同樣產(chǎn)生了死鎖現(xiàn)象。
代碼2:
-(void)gcdSyncTest
{
? ? ? ?任務2
? ? ? ?dispatch_sync(dispatch_get_main_queue(), ^{
? ? ? ?NSLog(@"hehe");
? ? ? ?});
}
其實捷犹,代碼1弛饭,代碼2有一種共同的原因,都使用了串行隊列萍歉,還在串行隊列中使用了 同步方式侣颂,首先,串行隊列的特點枪孩,一次只能完成一件事件憔晒,排隊FIFO方式執(zhí)行,同步方式又恰恰要執(zhí)行玩現(xiàn)在的事情蔑舞,才能夠做下一件事情拒担。就如代碼1,任務1中嵌套任務2攻询,都要求同步方式執(zhí)行从撼,首先,要求執(zhí)行完任務1在執(zhí)行任務2钧栖,然而低零,任務1中嵌套了任務2婆翔,要求任務2完成了,任務1才能完成掏婶,其實這邏輯本身是沖突的啃奴,導致不能夠在執(zhí)行下去的局面,陷入了死鎖狀態(tài)气堕。代碼2也是同理纺腊,我們可以相想一下,其實任務2嵌套在另外一個任務1中茎芭,必須任務1執(zhí)行完才能執(zhí)行任務2揖膜,可是任務1又要求完成任務2才能執(zhí)行,所以無法完成。