同步异步常常会拿来和阻塞非阻塞放在一起讨论。

因为它们似乎看起来很像,而且通常配套出现。

异步/同步

但实际上,同步和异步关注的是:获得结果的方式。

同步是自己等待结果,主动获得结果。

异步是等对方完成后通知自己结果,被动得到结果。

回调函数就是异步的一种通知形式。

非阻塞/阻塞

而阻塞和非阻塞,关注的是:线程的状态。

当线程遇到需要等待结果的时,会把线程挂起,那这种机制就是阻塞,而不会挂起的机制就是非阻塞。

搭配

同步异步与阻塞和非阻塞,理论上没有必然关联,两者关注的点不一样。

但通常,我们能够看到大多数程序,要么是同步阻塞的,要么是异步非阻塞的,为什么呢?

这是因为,异步只有和非阻塞搭配在一起,才有意义,而同步通常和阻塞搭配在一起。

比如:当你发起一个调用,调用没能及时给你结果,你把它先晾在一边(非阻塞),等到它有了结果,他会通知你调用结束了(异步)。

我们可以看得出来,上面异步非阻塞搭配在一起,效率才是最高的,你可以完全不管这个调用,去做别的事情。

现实中不会存在同步非阻塞或异步阻塞的程序,因为实现异步机制,出发点就是为了让线程不要等待调用的返回,而不等待又是为了什么?就是为了能够继续执行别的任务,这时候就需要非阻塞机制来使线程继续工作。

反过来,同步和阻塞自然是一起的,我既然需要等待结果返回,当然什么事也不做了,线程也不必再继续工作。

并行/并发

并行,物理上只有多核处理器才能真正意义上达到,是指同一时刻执行。

并发,软件层面所认为的同时进行,是指同一时间段执行。