同步与异步以及阻塞与非阻塞的区别

1.同步与异步

同步与异步的关注点是消息通信机制。

同步:在发出一个调用之时,没有得到结果之前,该调用就不返回。一旦调用返回就是得到了返回值。

           也就是调用者主动等待这个调用的结果。

异步:在发出调用之后,这个调用就直接返回,所以没有返回结果。

           也就是一个异步过程调用之后,调用者不会立刻得到结果,而是在调用发出之后,被调用者

           通过状态来通知调用者,或者通过回调函数来处理这个调用。

举一个通俗例子:

       你打电话问书店老板有没有《Effective C++》这本书。采用同步机制时,老板会说,我帮你找一下。

然后老板开始帮你找这本书,老板找书的过程中你不能挂电话,等找到了会给你结果(返回结果)。采用异步机制时,

老板会说我找到了给你打电话,然后会挂电话,等找到了,老板会主动给你打电话。老板通过“回电”这种方式回调。

2.阻塞与非阻塞

阻塞与非阻塞的关注点是程序等待调用结果时的状态。

阻塞调用:在调用结果返回之前,当前线程会被挂起,结果返回之后,线程才会变成运行状态。

非阻塞调用:在不能立刻得到返回结果之前,该调用不会阻塞当前进程。

值得注意的一点:采用同步调用,线程可以是激活状态,只是没有返回,即同步等待时是占用资源,却没做事。

还是可以用上面的例子:

       你打电话问书店老板有没有《Effective C++》这本书。如果是阻塞式调用,你会把自己“挂起”,直到知道

是否有这本书。如果是非阻塞调用,不管老板有没有告诉你,你就自己先干其他事情去了。在这里,阻塞与

非阻塞与是否同步异步无关。

总结:阻塞与非阻塞从调用者的角度来讲,调用之后是否去干其他事情。同步异步从被调用者来讲,调用发出

之后是否直接返回。

参考:https://www.zhihu.com/question/19732473/answer/20851256

 

你可能感兴趣的:(通信,同步异步)