同步、异步、阻塞、非阻塞

同步和异步与消息的通知机制有关。

同步就像一个任务队列一样,必须按顺序来,前一个完成了才能进行下一个。

异步是我只要通知你要做什么,然后你就自己去做,我不管你有没有做完,我通知了你我就去通知下一个,至于你有没有做成,不知道。

阻塞就是在调用结果返回前,当前线程会被挂起,一直处于等待消息通知,不能执行其他业务。

非阻塞就是调用后立即返回一个结果,这个结果并不是最终期望的数据,而是当前调用的状态。为了获取最终的数据,需要不停地轮询。

一般阻塞和非阻塞都是同步的,两者的区别是前者需要一直等着,不能做别的事情,后者是可以做别的,但是你要时不时地去看有没有结果了,也就是轮询。(注: 轮询是用来解决阻塞问题,而使用轮询会加大CPU的损耗,所以才会有epoll和IOCP这样的高效IO模型)

而异步一定是非阻塞(阻塞没有意义)。

这里我举个栗子:

一堆人去饭馆点餐。

同步阻塞:一个个按顺序排队,轮到谁谁就点餐,然后站在窗口等菜做好,这才离开,然后换下一个。

同步非阻塞:一个个按顺序排队,轮到谁谁就点餐,但是点完了会立即拿到一个号码牌,然后就可以离开了,换下一个点。离开的人可以站边上玩玩手机听听歌,但是需要时不时地看看菜做好了没有,好了就端走。

异步阻塞:一个个按顺序排队,轮到谁谁就点餐,窗口的人告诉你,你菜做好了会打电话给你的,但是你不听,非要站在窗口等,还不让后面的人点菜。(mdzz)

异步非阻塞:一个个按顺序排队,轮到谁谁就点餐,窗口的人告诉你,你菜做好了会打电话给你的,OK,你随便出去玩了,也不用在意你的好了没,立即换下一个点餐,这样速度很快,效率最高。

同步和异步的区别在于,消息通知是主动还是被动。是需要你主动在那里等着,或者主动不停的去轮询查看,还是不需要你主动去看,等它来通知你,主动和被动这是关键。

而阻塞和非阻塞都是同步的,关键是你是一直在那里等着,还是时不时地去看看,而不一直干等着。

同步和阻塞看起来好像一样,同步的表现形式和阻塞差不多,但其实不同,区别就是阻塞是将线程挂起,而同步并不表示当前线程啥都不做了,当前线程还是激活的状态。本质上两者关注点不同,同步是关注消息通知的机制,而阻塞是等待消息的过程中是否去做别的事情。

再接着上面那个例子:

同步就是A的餐没做好的时候,就不能让B点餐,看起来A好像是在傻等,但是A可以玩手机啊,可以听音乐啊。

而阻塞就是A的餐没做好的时候,不能让B点餐,而A还不能干别的事情,必须傻等着,那这就过分了。

阻塞只是同步的包含,但不等同于同步。

原文地址:https://www.cnblogs.com/yanchenyu/p/8462121.html