我相信这个问题大部分人都曾纠结过,这四者是个啥子关系。额,概念真是弄死人,今天我就大致讲一下我个人的理解,当然,小生不才,可能有不对的地方,望指出。
先说同步和异步的区别。
(本文的一些内容摘自知乎~)
1.同步与异步
同步和异步关注的是消息通信机制 (synchronouscommunication/ asynchronous communication)
所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
换句话说,就是由*调用者*主动等待这个*调用*的结果。
而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。
典型的异步编程模型比如Node.js。
下面我就举一个通俗易懂的小例子来说明两者的区别:
朱成有一个问题不知道答案,他去找寒素帮忙解答。寒素知道了,叫他稍等。过了一会儿,寒素解得答案,告诉了朱成,这个过程就是同步。
在没得到结果前,*调用*就不返回(朱成一直等着)。但是一旦调用返回(寒素解得答案),就得到返回值了(朱成得到了答案)。
但如果朱成问了寒素之后,寒素说好的,但没有马上回复朱成。一会儿之后,寒素解得答案,打电话告诉了朱成。这个过程就是异步。
*调用*在发出之后,这个调用就直接返回了(朱成可能一边玩去了),被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用(寒素打电话告诉朱成问题答案)。
2.阻塞与非阻塞
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
由上述可知,阻塞与非阻塞与线程密切相关(操作系统的内容),由线程的工作状态决定是阻塞还是非阻塞。
还是来举一个通俗易懂的例子吧!
陈现成有一个问题请教寒素,由于他非常虚心好学,在没得到答案前,就什么事也不做了,一直候在寒素身边,直到从寒素那得到答案。这就是阻塞。
这听起来好像和同步非常像,但阻塞关注的是线程状态,从本质上讲是CPU资源的分配方式。
非阻塞则是在没得到答案前,陈现成先去忙别的,但时不时回来问一下有答案了没呀?
总而言之,同步和异步关心的是”大师寒素”用什么方式回复你答案(当面回复,或事后电话回复),而阻塞非阻塞关心的是你自个是在一旁候着,还是去忙自己的。