dispatch_sync和dispatch_barrier_sync的区别

二者因为是sync提交,所以都是阻塞当前提交Block线程。
而它俩唯一的区别是:dispatch_sync并不能阻塞并行队列。

dispatch_queue_t queue = dispatch_queue_create("com.yahui.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
    dispatch_async(queue, ^{
        NSLog(@"任务二");
    });
    dispatch_async(queue, ^{
        NSLog(@"任务三");
    });
    //睡眠2秒
    [NSThread sleepForTimeInterval:2];
    NSLog(@"任务一");
});

输出结果 :

任务三
任务二
任务一

很显然,并行队列没有被sync所阻塞。
dispatch_barrier_sync可以阻塞并行队列(栅栏作用的体现):

dispatch_queue_t queue = dispatch_queue_create("com.yahui.queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_barrier_sync(queue, ^{
        dispatch_async(queue, ^{
            NSLog(@"任务二");
        });
        dispatch_async(queue, ^{
            NSLog(@"任务三");
        });
        //睡眠2秒
        [NSThread sleepForTimeInterval:2];
        NSLog(@"任务一");
    });

输出结果 :

任务一
任务二
任务三

如果上述结果看不明白请参考:dispatch_group_t和dispatch_barrier_async 同步多线程任务

你可能感兴趣的:(dispatch_sync和dispatch_barrier_sync的区别)