- 對(duì)同步、異步、串行、并行的執(zhí)行順序,之前總是模棱兩可,今天寫個(gè)Demo測(cè)試一下,廢話不多說(其實(shí)也不會(huì)說),直接上測(cè)試代碼
一、首先定義兩個(gè)方法,一個(gè)同步執(zhí)行相應(yīng)代碼,一個(gè)異步執(zhí)行
//同步執(zhí)行
- (void)syncTestWithQueue:(dispatch_queue_t)queue withBarrier:(BOOL)barrer{
NSLog(@"1");
dispatch_sync(queue, ^{
NSLog(@"start 1");
sleep(3);
NSLog(@"end 1");
});
NSLog(@"2");
dispatch_sync(queue, ^{
NSLog(@"start 2");
sleep(3);
NSLog(@"end 2");
});
NSLog(@"3");
dispatch_sync(queue, ^{
NSLog(@"start 3");
sleep(3);
NSLog(@"end 3");
});
NSLog(@"4");
dispatch_sync(queue, ^{
NSLog(@"start 4");
sleep(3);
NSLog(@"end 4");
});
NSLog(@"5");
if (barrer) {
dispatch_barrier_sync(queue, ^{
NSLog(@"barrier start 1");
sleep(3);
NSLog(@"barrier end 1");
});
NSLog(@"6");
dispatch_sync(queue, ^{
NSLog(@"start 5");
sleep(3);
NSLog(@"end 5");
});
NSLog(@"7");
}
}
//異步執(zhí)行
- (void)asyncTestWithQueue:(dispatch_queue_t)queue withBarrier:(BOOL)barrer{
NSLog(@"1");
dispatch_async(queue, ^{
NSLog(@"start 1");
sleep(3);
NSLog(@"end 1");
});
NSLog(@"2");
dispatch_async(queue, ^{
NSLog(@"start 2");
sleep(3);
NSLog(@"end 2");
});
NSLog(@"3");
dispatch_async(queue, ^{
NSLog(@"start 3");
sleep(3);
NSLog(@"end 3");
});
NSLog(@"4");
if (barrer) {
dispatch_barrier_async(queue, ^{
NSLog(@"barrier start 1");
sleep(3);
NSLog(@"barrier end 1");
});
NSLog(@"5");
dispatch_async(queue, ^{
NSLog(@"start 4");
sleep(3);
NSLog(@"end 4");
});
NSLog(@"6");
}
}
二、在自行創(chuàng)建串行隊(duì)列執(zhí)行這兩個(gè)方法
測(cè)試代碼
//自行創(chuàng)建串行隊(duì)列
dispatch_queue_t serialQueue=dispatch_queue_create("串行隊(duì)列", DISPATCH_QUEUE_SERIAL);
//1.同步
[self syncTestWithQueue:serialQueue withBarrier:YES];
//2.異步
[self asyncTestWithQueue:serialQueue withBarrier:YES];
輸出結(jié)果

syncTestWithQueue: withBarrier:

asyncTestWithQueue: withBarrier:
結(jié)論:
1.同步與異步block的執(zhí)行順序都是按順序執(zhí)行的,不同的是同步會(huì)阻塞線程,異步不會(huì)
2.dispatch_barrier,執(zhí)行順序 和 dispatch_sync與dispatch_async加入的block是一樣的
三、主線程串行隊(duì)列
測(cè)試代碼
dispatch_queue_t mainSerialQueue=dispatch_get_main_queue();
//1.同步
//會(huì)阻塞,不用想了
[self syncTestWithQueue:mainSerialQueue withBarrier:YES];
//2.異步
[self asyncTestWithQueue:mainSerialQueue withBarrier:YES];
輸出結(jié)果

asyncTestWithQueue: withBarrier:
結(jié)論
同步會(huì)阻塞,異步和自行創(chuàng)建串行隊(duì)列是一樣的
四、自行創(chuàng)建并行隊(duì)列
測(cè)試code
dispatch_queue_t concurrentQueue=dispatch_queue_create("并行隊(duì)列", DISPATCH_QUEUE_CONCURRENT);
//1.同步
[self syncTestWithQueue:concurrentQueue withBarrier:YES];
//2.異步
[self asyncTestWithQueue:concurrentQueue withBarrier:YES];
輸出

syncTestWithQueue: withBarrier:

asyncTestWithQueue: withBarrier:
結(jié)論
1.同步:由于會(huì)阻塞線程,所以并行與串行執(zhí)行順序是一樣的
2.異步:所有block都會(huì)一起執(zhí)行,dispatch_barrier執(zhí)行時(shí)之后加入的block,會(huì)等待barrier執(zhí)行完再執(zhí)行
五、全局并行隊(duì)列
測(cè)試code
dispatch_queue_t globalConcurrentQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//1.同步
[self syncTestWithQueue:globalConcurrentQueue withBarrier:YES];
//2.異步
[self asyncTestWithQueue:globalConcurrentQueue withBarrier:YES];
輸出

syncTestWithQueue: withBarrier:

asyncTestWithQueue: withBarrier:
結(jié)論
1.同步:與自行創(chuàng)建并發(fā)隊(duì)列是一樣的
2.異步:所有block都會(huì)一起執(zhí)行,但是,dispatch_barrier執(zhí)行時(shí)之后加入的block,不會(huì)等待barrier執(zhí)行完再執(zhí)行(dispatch_barrier不要用在全局并發(fā)隊(duì)列里)