同步 ( Synchronous )
同步是最简单的情况,有两个任务 A 和 B,先执行完 A 再执行 B,是为 A 与 B 同步。
异步 ( Asynchronous )
异步就是任务之间不会互相等待。
任务 A 和 B 同步时,A 先完成,B 后完成。
任务 A 和 B 异步时,它们的完成顺序互不影响。
并发 ( Concurrency )
并发和并行一定是异步的。
并发是一个比较宽泛的概念,只要多个任务看上去能够同时执行即可称为并发。
举两个例子:
在单核 CPU 下创建多线程时,CPU 会在线程间来回切换,这是并发。
JavaScript 是单线程的,它的任务来自事件循环队列,若当前任务需要访问网络,JavaScript 不会等待其完成,而是让它在结果返回后重新入队。
事件循环队列中的任务是并发的,当然,也是异步的。
并行 ( Parallel )
并行才是真正意义上的同时执行。
当你创建多个线程:
- 在多核的情况下,每个线程会被分配到独立的核心上运行,这就是并行,真正意义上的同时执行
- 在单核的机器中,操作系统会通过分配时间片的方式执行,此时只能称为并发。
总结
假设有任务 A 和 B:
- 同步:执行完 A 再执行 B
- 异步:A 和 B 不需要等待对方执行完
- 并发:可“同时”执行多个任务
- 伪并行:单核通过分配时间片来执行多线程
- 并行:真正意义上的同时执行,比如多核下的多线程
- 并发:可“同时”执行多个任务