1、同步、异步描述的是当前线程或代码流是否要阻塞以等待加入队列的任务执行完毕;同步要阻塞当前线程,异步不会阻塞当前线程。queue 为任务队列
dispatch_sync(queue, ^{...}) -> 同步,阻塞,等 queue 里的任务 “...” 执行完成后才会向下执行;
dispatch_async(queue, ^{...}) -> 异步,不阻塞,会开辟新的线程执行 queue 里的任务 “...”;
2、queue 表示队列,根据队列中多个任务的执行顺序不同,分为串行队列和并行队列;串行队列是指队列中的任务是一个接一个的按加入队列的顺序执行的,前面的任务执行完毕后才能执行其后面的任务;并发队列是指队列中的任务可以并发地执行。
2.1、创建串行队列的方法是:
dispatch_queue_t seririalQueue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);
同时主线程的队列也是串行队列,获取方法是:
dispatch_queue_t mainQueue = dispatch_get_main_queue();
2.2、创建并发队列的方法是:
dispatch_queue_t concurrentQueue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);
同时系统提供了获取系统并发队列的函数:
dispatch_queue_t queue = dispatch_get_global_queue(long identifier, unsigned long flags);
identifier 的值可以为:
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
四个参数值获取的并发队列优先级依次从高到底;第二个参数 flags 为系统保留参数,传入 0 即可。
2.3、串行和并发描述的是队列里各个任务是否可以并发执行;串行队列里的任务不能并发执行,只能一个接一个地执行,同一时刻该串行队列里的任务最多只有一个在执行;并发队列里的后面的任务不必等待前面的任务执行完毕再执行,可以多个同时执行,同一时刻该并行队列里的任务可以有多个正在执行。
3、比较与分析
同步串行队列 :不会创建新线程,在主线程里按照先后顺序执行(⚠️ 当串行队列为dispatch_get_main_queue()时,使用同步串行队列会造成死锁,当为自己创建的串行队列时,不会造成死锁)
同步并发队列:不会创建新线程,在主线程里按照先后顺序执行
异步串行队列:会创建新线程,新线程里的任务会按照先后顺序执行
异步并发队列:会创建新线程,新线程里的任务会同时执行
4、并发与并行 Concurrency vc Parallelism
并发和并行并不相同,并发代码的不同部分可以“同步”执行。然而,该怎样发生或是否发生都取决于系统。多核设备通过并行来同时执行多个线程;然而为了使单核设备也能实现这一点,它们必须先运行一个线程,执行一个上下文切换,然后运行另一个线程或进程。这通常发生的足够快以致给我们并发执行的错觉,并行要求并发,但并发并不能保证并行。(摘抄自GCD 介绍)