首先清楚一點就是dispatch_sync程序需等待這個結(jié)果才執(zhí)行下一步帮毁,dispatch_async無需等待結(jié)果繼續(xù)執(zhí)行下一步画株。
//注:這里的任務(wù)不要單純看作是一個簡單的log輸出,也可以是一個復(fù)雜的操作抖拦。
簡單異步操作
dispatch_async(dispatch_get_global_queue(0, 0), ^{
? ? ? ? NSLog(@"任務(wù)1");
? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{
? ? ? ? ? ? NSLog(@"任務(wù)2");
? ? ? ? });
? ? ? ? NSLog(@"任務(wù)3");
? ? });
? ? NSLog(@"任務(wù)4");
//任務(wù)1劫扒、4隨機輸出
//任務(wù)3和任務(wù)1在一個隊列,所以任務(wù)3在任務(wù)1后面輸出
//任務(wù)2加入了主隊列聚霜,添加在主隊列最后面所以在任務(wù)4后面輸出
最簡單的死鎖
dispatch_sync(dispatch_get_main_queue(), ^{
? ? ? ? NSLog(@"任務(wù)1");
});
NSLog(@"任務(wù)2");
//死鎖 無輸出。因為任務(wù)1加入了主隊列最后面珠叔,等待任務(wù)2完成蝎宇;而這時因為dispatch_sync所以任務(wù)2又在等待任務(wù)1完成所以就造成了死鎖
dispatch_async(dispatch_get_global_queue(0, 0), ^{
? ? ? ? NSLog(@"任務(wù)1");
? ? ? ? dispatch_sync(dispatch_get_main_queue(), ^{
? ? ? ? ? ? NSLog(@"任務(wù)2");
? ? ? ? });
? ? ? ? NSLog(@"任務(wù)3");
? ? });
? ? NSLog(@"任務(wù)4");
//任務(wù)1、4隨機輸出
//因為dispatch_sync 任務(wù)3等待任務(wù)2完成祷安,又因為任務(wù)2加入的是主隊列姥芥,所以任務(wù)2等待任務(wù)4完成。所以執(zhí)行順序是任務(wù)4->任務(wù)2->任務(wù)3
dispatch_queue_t serialQueue= dispatch_queue_create("串行隊列", DISPATCH_QUEUE_SERIAL);
? ? dispatch_async(serialQueue, ^{
? ? ? ? NSLog(@"任務(wù)1");
? ? ? ? dispatch_sync(serialQueue, ^{
? ? ? ? ? ? NSLog(@"任務(wù)2");
? ? ? ? });
? ? ? ? NSLog(@"任務(wù)3");
? ? });
? ? NSLog(@"任務(wù)4");
//任務(wù)1辆憔、4隨機輸出
//死鎖 任務(wù)2和任務(wù)3不執(zhí)行撇眯。原因:因為serialQueue是串行隊列报嵌,所以同步時把任務(wù)2添加到任務(wù)3后面虱咧,又因為同步任務(wù)3等待任務(wù)2完成,所以就造成了死鎖锚国。
注:如果serialQueue是并發(fā)隊列就不會造成死鎖腕巡,因為并發(fā)隊列并不會把任務(wù)2添加到任務(wù)3后面。還有值得注意的是dispatch_get_global_queue是并發(fā)隊列血筑,所以平時一直用的這個也沒遇到過死鎖吧绘沉。
這些都是本人對線程的一些理解,如有錯誤請指正豺总。