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

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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


 总结:

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

 

posted @ 2019-04-30 11:06  colorfulCat  阅读(2374)  评论(1编辑  收藏  举报