zoukankan      html  css  js  c++  java
  • 同步、异步、阻塞、非阻塞

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

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

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

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

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

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

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

    这里我举个栗子:

    一堆人去饭馆点餐。

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

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

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

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

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

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

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

    再接着上面那个例子:

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

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

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

  • 相关阅读:
    java语法基础
    HashMap中的put()和get()的实现原理
    理解:o(1), o(n), o(logn), o(nlogn) 时间复杂度
    mongodb去重分页查询支持排序
    elk日志分析系统搭建(window )亲自搭建
    IDEA更改主题插件——Material Theme UI
    css实现图片的瀑布流且右上角有计数
    C# string "yyMMdd" 转DataTime
    Vue.js系列(一):Vue项目创建详解
    VS2017常用快捷键
  • 原文地址:https://www.cnblogs.com/yanchenyu/p/8462121.html
Copyright © 2011-2022 走看看