同步,异步,阻塞,非阻塞形象讲解

我相信这个问题大部分人都曾纠结过,这四者是个啥子关系。额,概念真是弄死人,今天我就大致讲一下我个人的理解,当然,小生不才,可能有不对的地方,望指出。

先说同步和异步的区别。

(本文的一些内容摘自知乎~)

1.同步与异步

同步和异步关注的是消息通信机制 (synchronouscommunication/ asynchronous communication)

 

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

换句话说,就是由*调用者*主动等待这个*调用*的结果。

 

而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。

典型的异步编程模型比如Node.js。

 

下面我就举一个通俗易懂的小例子来说明两者的区别:

朱成有一个问题不知道答案,他去找寒素帮忙解答。寒素知道了,叫他稍等。过了一会儿,寒素解得答案,告诉了朱成,这个过程就是同步。

在没得到结果前,*调用*就不返回(朱成一直等着)。但是一旦调用返回(寒素解得答案),就得到返回值了(朱成得到了答案)。

 

但如果朱成问了寒素之后,寒素说好的,但没有马上回复朱成。一会儿之后,寒素解得答案,打电话告诉了朱成。这个过程就是异步。

*调用*在发出之后,这个调用就直接返回了(朱成可能一边玩去了),被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用(寒素打电话告诉朱成问题答案)。

 

2.阻塞与非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

 

阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。

非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

 

由上述可知,阻塞与非阻塞与线程密切相关(操作系统的内容),由线程的工作状态决定是阻塞还是非阻塞。

 

还是来举一个通俗易懂的例子吧!

陈现成有一个问题请教寒素,由于他非常虚心好学,在没得到答案前,就什么事也不做了,一直候在寒素身边,直到从寒素那得到答案。这就是阻塞。

这听起来好像和同步非常像,但阻塞关注的是线程状态,从本质上讲是CPU资源的分配方式。

 

非阻塞则是在没得到答案前,陈现成先去忙别的,但时不时回来问一下有答案了没呀?

 

总而言之,同步和异步关心的是”大师寒素”用什么方式回复你答案(当面回复,或事后电话回复),而阻塞非阻塞关心的是你自个是在一旁候着,还是去忙自己的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值