同步/异步 阻塞/非阻塞

我觉得首先这四个概念不要都放在一起看,要两个两个来看。
首先同步和异步,
同步即客户端发出一个请求到服务器,客户端一直等待服务器的响应,在等待的服务器返回结果前不可以做任何其他的事情。

异步即客户端发出一个请求到服务器后,客户端就不管后续的事情了,继续干其它的事情,当服务器端完成响应后会自动回来提醒客户端。

下面再看阻塞和非阻塞
阻塞即当客户端向服务端发送请求后,服务器端会对请求进行处理(数据整合等),而没有立刻返回结果,此时客户端则会一直等待服务器端处理,直到服务器端处理完毕后返回结果。因为没有立刻返回结果,等待的这段时间就造成了阻塞。

非阻塞即当客户端向服务器发送请求后,服务器端会对请求进行处理(数据整合等),这时虽然服务器端没有处理完,但是也会立刻返回一个结果,但是是返回一个错误的结果到客户端。客户端接受到结果后会继续请求服务器端,如果服务器端没有处理完毕依然会返回一个错误的结果(立刻返回),客户端就这样请求,接收直到接收到正确的结果。因为每次都是立刻返回结果,所以并未对请求造成阻塞。

总结,同步和异步侧重的是一件事是否做完,同步时只有做完才能再做另外一件(请求发出后一定要等到结果的回馈,才进行另一个请求),异步是一件事情即使没做完也可以做另外一件(请求发出后,即使没有等到结果,依然会发出另外的请求)。阻塞和非阻塞则侧重的是每个请求是否立刻得到结果。所以如果从结果上来看,阻塞和非阻塞都属于同步,因为阻塞的情况下请求是一直等到响应结果才返回,期间并没有做其他的事情,非阻塞的情况下也一样,请求也是等到响应结果才返回,只不过这个结果返回时立刻的,无论结果正确还是错误。

如果上面的解释还是没有理解的话,我举个形象点的例子:
比如我们在星巴克点咖啡喝,
我们到柜台点一杯美式咖啡,
1)第一种情况服务员告诉我们说还要做一会儿才好,如果此时我们站在柜台等一直等到服务员做好咖啡后,你拿回座位上,然后和朋友聊天,这属于同步,也属于阻塞。
2)第二种情况服务员告诉我们说还要做一会儿才好,如果此时我们直接回到座位(带回来一个并没有好的结果)先和朋友聊了一会儿天,过了一会儿又到服务员那里问咖啡是否制作好了,就这样反复循环知道拿到制作好的咖啡。这属于非阻塞。
3)第三种情况,我点完咖啡后,直接回到座位什么都不用管一直和朋友聊天,服务员把咖啡做好了以后直接把咖啡送到你面前。这属于异步。

所以最后还有一点事要注意的除了异步以外,制作好的咖啡(即结果)都是请求放去获取的,但是异步却是响应方推过来的。

猜你喜欢

转载自fenglin-java.iteye.com/blog/2022934