看过这篇“同步异步阻塞非阻塞详解”,我彻底懂了 收藏 阅读:382
2020-03-20 22:03:34

   在网络编程中,会经常出现异步、同步、阻塞、非阻塞,很容易混淆。或者在面试过程中,经常会被问到,但是概念容易混淆,很容易答不出来。相信看过此文之后,会彻底的了解。先不说概念,先举个例子。

  现在有个场景,隔壁老王在越黑天高的夜晚,坐在公园的长椅上,等待自己心仪的女朋友来约会。隔壁老王在等待过程中有可能有如下动作:

  场景一:隔壁老王,一直坐在长椅上等待,什么都不干。这个时候老王心急如焚呀。

  场景二:隔壁老王,实在着急,就去公园小树林溜达一下,时不时的回到长椅旁,观察下女朋友有没有到。

  场景三:还好,隔壁老王由于女朋友经常迟到,约定好了,如果女朋友到了会发个微信给隔壁老王,我到了。所以,这次,隔壁老王还是在长椅上焦急的等待女朋友,女朋友到了会给老王发给微信,亲爱的,我到了。这时候感觉隔壁老王特别二。

  场景四:由于隔壁老王和女朋友约定好了,女朋友到了会发微信通知。这时候,隔壁老王去公园旁边的咖啡厅喝杯咖啡,边喝边玩手机,此时心情极好。*

  场景一是同步阻塞。

  场景二是同步非阻塞。

  场景三是异步阻塞。

  场景四是异步非阻塞。

1.什么是同步异步

  同步异步,关注的是消息通知机制。

  比如A任务调用B任务,A任务一直等待B任务完成,这个就是同步,是可靠的任务序列,A和B同时成功,同时失败,状态保持一致。

A任务调用B任务后,B任务开始执行任务,B任务完成后会通知A任务。

  这里B任务通知A任务,可以有三种方式:状态、通知、回调。

如果我们使用状态,A任务会定时去查询B任务的状态,这种效率是非常低的,不可取。

反之,通过通知或者回调效率就很高,因为A任务不需要执行额外的其他操作。

2.阻塞非阻塞

  阻塞非阻塞,关注的是等待消息时自己的状态。

  阻塞是指,任务在等待消息通知时,自己设么都不干,程序挂起,一直到收到通知为止。

  非阻塞是指,A任务在调用B任务后,立马返回,继续执行其他操作。表面上看非阻塞是可以提高CPU利用率的,但是会增加系统线程切换的成本,孰好孰坏还需要衡量。

3.同步阻塞

  场景一就是同步阻塞。隔壁老王和女朋友没有消息通知,隔壁老王一直在等待女朋友,期间什么都做。效率最低。

4.同步非阻塞

  场景二,由于没有通知机制,隔壁老王会不断的从小树林回来,观察女朋友是否到达。这种效率也是很低的,隔壁老王需要不断的切换自己的位置。

5.异步阻塞

  场景三,有通知时异步的,自己什么都不敢,这个是阻塞,现实中也是很少的。

6.异步非阻塞

  场景四,效率更高。

  总结,同步异步阻塞非阻塞就这么简单。后期,还是结合NIO、BIO、AIO,以及还会结合Linux的select,poll,epoll和零拷贝出相关博文。


读后有收获,请作者喝杯咖啡


全部评论

发表评论