欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

同步与异步,堵塞与非堵塞

程序员文章站 2024-01-13 18:23:58
...

hi~ 我是郑突突
今日应朋友阿奶的热情 叫大哥 请求下,整理一下同步与异步,阻塞与非阻塞。


同步和异步强调的是消息通信机制 (synchronous communication/ asynchronous communication)
同步:就是在发出一个"调用"时,在没有得到结果之前,该“调用”就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由“调用者”主动等待这个“调用”的结果。
异步:"调用"在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在"调用"发出后,"被调用者"通过状态、通知来通知调用者,或通过回调函数处理这个调用。
举个例子:
今天阿奶给突突打电话想问1+1=2对不对,2+2=4对不对。
同步:当阿奶拨出电话时,突突说:“你等一下,我算一下,(有可能算了5秒,有可能5小时),算好了告诉你答案。“阿奶就一直傻等着,最终可能不能及时得到答案,导致阿奶今天要做的事都没有完成,而白白花掉了时间。查好后告诉了阿奶(返回阿奶的调用结果)。然后阿奶又问2+2=4对不对。
异步:突突直接告诉阿奶说我查一下啊,查好了打电话给你,然后直接挂电话了(不返回阿奶的调用结果)。阿奶打电话问突突2+2=4对不对呀。突突直接告诉阿奶说我查一下啊,查好了打电话给你,然后直接挂电话了(不返回阿奶的调用结果)。然后查好了,突突会主动打电话给阿奶。在这里突突通过“回电”这种方式来回调。

阻塞和非阻塞强调的是程序在等待调用结果(消息,返回值)时的状态
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
还是上面的例子,
阿奶打电话问突突1+1=2对不对,阿奶如果是阻塞式调用,阿奶会一直把自己“挂起”,直到得到1+1=2对不对的结果,如果是非阻塞式调用,阿奶不管突突有没有告诉阿奶,阿奶自己先一边去玩了, 当然阿奶也要偶尔过几分钟check一下突突有没有返回结果。
在这里阻塞与非阻塞与是否同步异步无关。跟突突通过什么方式回答你结果无关。
总结一下
同步还是异步说的是请求方和被请求方的交流方式
阻塞还是不阻塞看请求方自己
这里有一个很好的例子,你理解下面的例子就差不多了。
出场人物:小明,水壶2个(普通水壶,简称水壶;会响的水壶,简称响水壶)


1.小明把水壶放到火上,然后在那傻等水开。(同步阻塞)
小明觉得自己有点傻。。。。。。
2.小明把水壶放到火上,然后去客厅看电视,时不时的去厨房看看水开没有。(同步非阻塞)
小明还是觉得自己有点傻,于是变高端了,买了一个水烧开了会响的水壶。水开之后能大声的发出响声提示人水开了。。。
3.小明把响水壶放到火上,然后在那傻等水开。(异步阻塞)
小明觉得傻等没有意义,不应该傻等。。。
4.小明把响水水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去处理。(异步非阻塞)
小明觉得自己聪明了。。。完。。。

有什么总结不好的地方请多指教 ^ _ ^

本文章由下面链接总结而来
https://www.zhihu.com/question/19732473
https://blog.csdn.net/huangqiang1363/article/details/79508852
https://www.cnblogs.com/aberwang/p/9404139.html

相关标签: 同步 阻塞