通俗理解同步、异步、阻塞、非阻塞

目录

同步与异步

        同步

        异步

阻塞与非阻塞

        阻塞

        非阻塞

组合方式

同步阻塞【效率最低】

同步非阻塞

异步阻塞

异步非阻塞【效率最高】

总结


同步异步,阻塞非阻塞是完全不同的概念。

同步与异步

同步、异步描述的是多个线程之间的协作关系,线程之间要么是同步,要么是异步

        同步

        只要一段调用开始执行,就必须要得到执行结果,然后才能继续后面的操作。这个结果的获取,要么是傻等,要么是轮询。

        例如:以下调用方法a执行3秒,方法b执行4秒,c最终等于a+b,同步调用,b的执行必须等待a执行完,于是该调用一共执行3+4+1=8秒。c开始执行的时候a、b已经得到执行结果,因此c不用关心a、b结果的问题,直接相加即可得到结果。

{
    function a = {...},执行3秒【同步】
    function b = {...},执行4秒【同步】
    function c = a()+b(),执行1秒【同步】
}

        异步

        开始执行一个操作,可以不等结果去执行另一个操作,刚刚的操作执行完了通知我就好。

        例如:依然是上面的例子,此时将a和b方法异步调用,c最终依赖a与b的执行结果。因此a、b可以同时开始执行,因此调用一共执行:4+1=5秒。但因为a、b同时开始执行,c需要判断a、b是否均执行结束,才可开始做加法操作。

{
    function a = {...},执行3秒【异步】
    function b = {...},执行4秒【异步】
    function c = a()+b(),执行1秒【依赖a/b执行结果】
}

阻塞与非阻塞

阻塞与非阻塞更关心的是同一个线程内部的执行状态,在一个时间点,线程要么阻塞,要么非阻塞

        阻塞

        一个调用只要开始执行,当前线程就会被挂起,在执行过程中,即使上一步执行慢了,下一步也会一直等待,直到得到结果。于是该线程一直被占用,但并没有处于工作状态,浪费资源。

        例如:方法a,我想吃红烧肉,我给妈妈传递了执行指令,我妈在那做,我就干等着什么也不干跟个傻子似的,直到亲眼看到我妈做完了,我就开始吃。

{
    function a = {我跟我妈说我想吃红烧肉},执行1小时
    function b = {吃饭}
}

        非阻塞

        调用得到结果之前,我不阻塞线程,我该干嘛干嘛去。

        调用开始后,我已经发出我的执行指令,后面可能还要执行很久,如果我不走,就要干等着,我不想等,就先去干别的,但是我又不知道你啥时候完成,就一会回来问一句弄完了吗?没弄完继续忙别的,一会回来再问一遍,直到执行结束,我来拿结果。但如果询问时间间隔短,会造成CPU高速空转。

        例如:方法a,我想吃红烧肉,我给妈妈传递了执行指令,但具体怎么操作是妈妈来完成,我如果在那里干等这一个小时,无疑是极大的浪费,我可以在这个时间干点什么,比如看电视,然后等着吃饭。然后什么时候能吃呢?我不等通知,我妈也不会主动告诉我,我每隔10分钟问一次你做好了吗?到第六次的时候得到了最好的回应,那我直接去吃饭。

{
    function a = {我跟我妈说我想吃红烧肉},执行1小时
    function b = {我看会电视},执行时间不确定【非阻塞】
    function c = {吃饭}
}

组合方式

同步阻塞【效率最低】

        我妈做饭我傻等,啥也不干就等着吃【省事,等就行了,唯一的缺点就是磨叽,明明可以干很多事,非要傻等】

单任务顺序执行

同步非阻塞

        我妈做饭我去看会电视,但是我一会问一句饭做好了吗?直到吃饭【其实你可以不一直问的,非要问,你嗓子不疼吗?你不疼你妈还疼呢。心累】

多任务轮询

异步阻塞

        我妈做饭我想去看电视但是去不了,要等我妈做完了告诉我。【想去看电视的心情是好的,但是你妈做不完不放你走,但好处是起码不用你一直问,他做完了会告诉你,也算省心】

单任务等通知

异步非阻塞【效率最高】

        我妈做饭我去看会电视,就踏实看,我妈喊我好了我就去吃饭【这多好,该干的都干了,安心等着吃饭就行了,两不耽误,还不闹挺】

多任务等通知

总结

  • 同步阻塞效率最低,在这个过程中他明明有手却什么都不能干,慢慢悠悠的把所有事一项一项干完就算完成任务,当然这中间线程的通信也无比的简单,没有让步,没有等待,平平淡淡才是真;
  • 异步非阻塞效率最高,他可以解放双手,两个人在同样的时间干着不同的事情,而且当两件时间需要被迫联系到一起时,你通知我一下我就来了,省去了通信和思考时间。但其中的配合必须恰到好处;
  • 同步非阻塞 多做无用功,也可以在同样的时间干不同的事,但比较烦人的是,同步只能自己看结果,不会向异步一样完事通知,所以一会来问我一句一会来问我一句;
  • 异步阻塞 白瞎了,的确是干了个大尬,就是异步情况明显没有阻挡我放飞自我的脚步,却在刚要迈腿的时候被阻塞限制了行动,我也不一直问你好了没,等你告诉我就行,但对我来说无疑是 度日如如年。这种情况在生产环境不会存在。因此,一般异步都要配合非阻塞使用。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值