同步、异步、阻塞、非阻塞的区别

同步、异步、阻塞、非阻塞这几个概念在并发编程和架构设计中用的比较多,这里小记一下对他们的理解,先阐释一下他们之间的区别:

 

同步:多个任务或事件必须顺序执行,前一个任务没执行完,后一行任务就不能进行。

实现:常见的顺序编程, 串行执行

场景:B/S架构的HTTP请求-响应模式、OA流程。

 

异步多个任务或事情可以并行执行,任意一个任务的执行不会阻塞另外一个任务的执行。异步调用完成后,通过通知或回调将结果传递给接收者。异步常用于操作时间比较耗时的场合,为了不block当前的工作流程,而采用异步。

实现:新建一个线程,或把任务放到消息队列中由消费者处理、并行处理

场景:发短信、写信、写邮件、发微信,网上办电信业务(比如申请信用卡)、node.js、ajax。

 

同步和异步着重点在于多个任务的执行过程中,一个任务的执行是否会导致整个流程的阻塞

 

阻塞:当调用没有结果返回时,线程处于挂起状态(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行),等待结果返回。

场景:排队进火车检票口、排队办业务。

 

非阻塞:当调用没有结果返回时,马上返回一个信息,告知条件不满足,不会一直在那儿等待。

场景: 网上买火车票时,没订到票时,使用定时监控软件去看有没有火车票。

 

 

而阻塞和非阻塞着重点在于发出一个请求操作时,如果进行操作的条件不满足是否会返会一个标志信息告知条件不满足

 

 

容易confuse的地方

有时候阻塞和同步容易confuse,实际上是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

 

小结

想构建高性能的服务,应该考虑是否可以使用异步非阻塞架构, 比如 node.js、netty、nio等。

 

猜你喜欢

转载自geeksun.iteye.com/blog/2226793