1. 同步与异步
同步和异步关注的是消息通信机制。同步就是在发出一个【调用】时,在没有拿到结果之前,该【调用】就不返回,但是一旦调用返回,就得到返回值了。
换句话说,就是由【调用者】主动等待这个【调用】的结果。
而异步正好相反,【调用】在发出之后,这个调用就直接返回了,所以没有返回结果。也就是说,当一个异步过程调用发出后,调用者不会立刻得到结果
而是在【调用】发出后,【被调用者】通过状态、通知来通知调用者,或通过回调函数处理这个调用。
举个例子:
你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等一下,我查一下,然后开始查啊查,等查好了(可能是
5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂了电话(不返回结果),然后查好了,他会主动打电话给你。在这里
老板通过<回电>这种方式来回调。
总结:
同步和异步针对应用程序来说,关注的是程序中间的协作关系。
同步:执行一个操作之后,等待结果,然后才继续执行后续的操作。
异步:执行一个操作之后,可以去执行其他操作,然后等待通知再回来执行刚才没执行完的操作。
1. 阻塞与非阻塞
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。
阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
还是上面的例子:
你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞调用,你会一直把自己挂起,直到得到这本书有没有的结果,如果是非阻塞调用
你不管老板有没有告诉你,你自己先一边去玩了,当然你也要偶尔过几分钟check一下老板有没有返回结果。
阻塞与非阻塞与是否同步异步无关。
总结:
阻塞:进程给CPU传达一个任务之后,一直在等待CPU处理完成,然后才执行后边的操作。
非阻塞:进程给CPU传达一个任务之后,继续处理后续的操作,隔段时间再来询问之前的操作是否完成,这样的机制也叫轮询。
参考网址:
https://www.zhihu.com/question/19732473