首先,咱們來看下下面一個例子: 代碼:(串行隊列裏同步線程嵌套) NSLog(@"haha"); dispatch_queue_t queue = dispatch_queue_create("test", nil); dispatch_sync(queue, ^ { NSLog(@"xxoo0"); dispatch_sync(queue, ^ { NSLog(@"xxoo1"); }); NSLog(@"xxoo2"); }); 運行結果: 2014-08-25 14:30:24.440 test[4424:60b] haha 2014-08-25 14:30:24.441 test[4424:60b] xxoo0
在test串行隊列中,有兩個同步線程嵌套致使第二個同步線程運行不了,產生了死鎖。 緣由是:在串行隊列中,第二個同步線程要執行,必須等待第一個同步線程執行完成後纔可進行,可是第一個同步線程要執行完又得等待第二個同步線程執行完,由於第二個同步線程嵌套在第一個同步線程裏,這就形成了兩個同步線程互相等待,即死鎖。 特別強調:是在串行隊列裏!
dispatch_queue_t queue = dispatch_queue_create("test", nil); 這行代碼中,第二個參數爲nil值,至關與值爲DISPATCH_QUEUE_SERIAL,即爲串行的。若是把值改爲DISPATCH_QUEUE_CONCURRENT,即爲並行的,就不會致使兩個同步線程死鎖。或者使用dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)也行,由於dispatch_get_global_queue是並行隊列。
ok,咱們來看第二個例子:
代碼:(主線程裏的同步線程) NSLog(@"haha"); dispatch_sync(dispatch_get_main_queue(), ^ { NSLog(@"xxoo"); }); 運行結果: 2014-08-25 15:01:58.922 test[4797:60b] haha 結果仍是死鎖,這個例子其實和第一個例子是相似的,主線程其實就是在一個串行隊列裏的,咱們寫的這個同步線程就至關與第一個例子的第二個嵌套的同步線程,由於這個同步線程是在主線程裏寫的,就至關於嵌套在主線程裏的。 因此,對於 dispatch_sync(queue, ^{}); 這行代碼的意義能夠歸納爲: 會阻塞當前線程等待串行queue中的全部任務執行完成後再向下執行。