最准确的理解同步/异步,阻塞/非阻塞

网上流传着一个小故事来介绍同步/异步,阻塞/非阻塞的概念

相信不少同学都看过,(普通水壶,简称水壶;会响的水壶,简称响水壶)。具体如下:

同步阻塞:小明把水壶放到火上,然后在那傻等水开

同步非阻塞:小明把水壶放到火上,然后去客厅看电视,时不时的去厨房看看水开没有

异步阻塞:小明把响水壶放到火上,然后在那傻等水开

异步非阻塞:小明把响水水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去处理


   刚看到这个例子的时候,我也觉得讲的很生动,一看就明白,但是过一段时间之后,发现自己还是会混淆上面的几个概念(冥冥之中觉得有bug)。反复查阅网上资料之后,发现网上基本都是这个例子。最后查阅书籍,终于明白了上述概念的真正含义。

 上面的例子让人有以下感觉:

一、如果是同步,那一定就是阻塞的啊,因为调用者需要拿到结果才能执行后面的任务

二、如果是异步,那一定是非阻塞的啊,调用者可以继续往后执行

 现在是我给大家解惑的时候了,直接给出概念

同步/异步:形容一次方法的调用,在单线程中。描述的是执行者是否具备主动通知功能

  同步,调用者会等到方法调用返回后才能继续后面的行为

  异步,调用者不需要等到方法返回,方法执行完毕后会主动通知调用者


 阻塞/非阻塞:调用者是否可以执行多个任务,在多个线程中。描述的是调用者的多个线程是否可以同时执行

  阻塞,线程1和线程2不能同时进行

  非阻塞,线程1和线程2可以同时进行


 总结:

        看明白了吗?网上小明烧水的这个例子完全没有提及多线程(被隐藏起来,需要我们自己去发现和理解),但是同步和阻塞完全是在单线程和多线程这两个维度上的概念。简单的说,如果是单线程,不管是同步还是异步,肯定是阻塞的。阻塞和非阻塞只有在多线程中才有意义。并且小明烧水的时候去看电视,隐含了这里就是另外新开了一个线程去看电视,而不是在烧水的这个线程中去执行看电视,否则毫无意义。以上,欢迎指正!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值