对同步阻塞、同步非阻塞、异步非阻塞这些名词一直混淆不清,虽然在日常的开发中经常接触到这些概念,比如ajax的异步请求,Angular、grails 中的promise,python中的async,但一直对这些名词没有一个清晰的定义。网上找了很多关于这方面的资料,很多时候,大家也都是举例子说明,没有明确的解释。结合资料,做了以下下总结。
- 同步(sync...)与异步(async...)
两者关注的是程序调用者与被调用者之间的消息通信机制- 同步:在发出一个调用之后,在没有得到被调用者返回的结果之前,调用者会等待。一旦这个调用返回,就得到返回值了。
- 异步:在发出一个调用之后,调用者不会立即得到结果。而是被调用者处理完调用得到结果之后,通过状态、通知等手段来通知调用者,或者通过回调函数来处理。
举个常见的买书例子:
小明去书店买《Thinking in Java》,老板说这本书卖光了,正在从别的店调货过来,再过两个小时就有货了,小明于是等了两个小时,买到了闻名已久的这本书。这就是同步,小明向书店发出调用,等待了两个小时,得到了结果。
第二次小明又去买书,这次买的是《javaScript高级程序设计》,老板说暂时缺货,小明来一次书店不容易,跟老板商议好有货了直接寄给他(注册回调函数),老板欣然答应。两天后,老板打电话通知小明书到了,并且已经寄给他了(调用回调函数)。这就是异步调用的过程。
- 阻塞与非阻塞
两者关注的是调用者在等待结果返回结果时候的状态- 阻塞:在等待结果返回之前,当前线程会挂起,不去执行别的任务,直到结果返回。
- 非阻塞:在不能立刻得到结果之前,调用者不会阻塞当前线程,当前线程可以执行别的任务。
同步不一定阻塞,异步不一定非阻塞。还是上面的例子,第一次小明在等待的两个小时过程中,又去逛了逛周围的店铺,只不过每次路过书店门口的时候都要问一下书有没有送过来。第二次在等待的两天中,小明什么也没干,专心致志的等老板电话。。
其实我们常说的这几个概念一般都是在程序API调用层次的,如果在线程层面上讨论这些,可能会不一样,比如多路复用,我们说它是同步非阻塞的,因为从整体来看,不会阻塞程序的整体运行,但实际上它也只是改变了阻塞的位置。
网友评论