同步、异步、并发、并行的简单理解

308 阅读1分钟

同步 ( 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 不需要等待对方执行完
    • 并发:可“同时”执行多个任务
      • 伪并行:单核通过分配时间片来执行多线程
      • 并行:真正意义上的同时执行,比如多核下的多线程