同步、异步、阻塞和非阻塞这四个概念经常穿梭于IT教材和参考资料中,我也困惑久矣,晚上在知乎看到网友的一些讲解,写的非常好,于是特地记录总结一下。

我的理解

术语对比

  • 同步和异步,描述的是请求方和响应方的通信方式,同步侧重于请求方主动索取响应结果。异步的含义是,请求方发出请求后就完事了,至于响应结果的获取,它并不那么关心,响应结果是由响应方主动通知过来,或者通过回调的方式让请求方知晓响应结果。

  • 阻塞和非阻塞,描述的是请求方的状态,请求发出之后,请求方在收到响应结果之前,可能全部的时间都在等待这个响应结果,则是阻塞,也可能还回去干别的事,这是非阻塞。

  • 同步阻塞和同步非阻塞:请求方以同步的方式获取响应结果的这段时间里,可能什么事也不干,百分之百地处于轮询忙等状态,这是同步阻塞。也可能在这段里,请求方去作别的事,比方说看美女啦,但是他并没有忘记去查询响应结果,他隔一段时间地间歇性轮询响应结果,这是同步非阻塞。

  • 异步阻塞和异步非阻塞:请求方以异步的方式获得响应结果,虽然获得响应结果是由响应方主动通知过来的,或者是通过回调请求方之前已经写好的例程。但是在获得响应结果之前的这段时间里,请求方可能发呆等待,也可能做别的事情去了,于是就有了异步阻塞和异步非阻塞。

举个栗子

西门吹雪看了张柏芝的某著名电影后,对她莫名好感,历尽千辛万苦,联系上了张柏芝,握草,那还不抓紧机会表白啦。于是一天夜晚西门吹雪在张柏芝的宿舍楼下,向她表白了,表白的内容请参考《大话西游》,这里我们只关注表白的结果和相关行为:

  1. 张柏芝说,请容我回去好好考虑一下吧,毕竟这是很慎重的事。张柏芝回去后,西门吹雪站在原地等待,打通张柏芝的电话后,一遍又一遍地问结果。这是同步阻塞。
  2. 张柏芝说,请容我回去好好考虑一下吧,毕竟这是很慎重的事。张柏芝回去后,西门吹雪掏出小米手机开始玩QQ斗地主,当然每隔五分钟打张柏芝的电话一次问结果,不停地这样下去。这是同步非阻塞。
  3. 张柏芝说,请容我回去好好考虑一下吧,毕竟这是很慎重的事,我想好了我打电话告诉你结果。西门吹雪待在原地,万分忐忑地发呆起来,过了一个小时后,张柏芝打来了电话,告知西门吹雪只能做普通朋友,哈哈。这是异步阻塞。
  4. 张柏芝说,请容我回去好好考虑一下吧,毕竟这是很慎重的事,我想好了我打电话告诉你结果。于是西门吹雪掏出小米手机开始玩QQ斗地主,一小时后,张柏芝主动打来电话,告知不合适。这是异步非阻塞。

知乎上的讲解

出处:怎样理解阻塞非阻塞与同步异步的区别?

严肃网友:

“阻塞”与”非阻塞”与”同步”与“异步”不能简单的从字面理解,提供一个从分布式系统角度的回答。

  • 同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。典型的异步编程模型比如Node.js 举个通俗的例子:你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下”,然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
  • 阻塞与非阻塞 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。还是上面的例子,你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。如果是关心blocking IO/ asynchronous IO, 参考 Unix Network Programming View Book相关评论: