zhenlanghuo's Blog

同步异步、阻塞非阻塞的区别

2017/05/20

最近看面经的时候看到说BIO、NIO、AIO的区别,查了下发现BIO是同步阻塞的、NIO是同步非阻塞的、AIO是异步非阻塞的,这时候我就懵逼了,同步还能非阻塞[尼克扬问号脸]?然后好好地查了一下同步异步的区别、阻塞非阻塞的区别和同步异步与阻塞非阻塞的区别。


同步与异步

同步和异步关注的是消息通信机制

同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回一旦调用返回,就得到返回值
异步,就是调用在发出之后,这个调用就直接返回了,所以没有返回结果。被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用

如果把调用一个函数当做成完成一件事的角度看:
同步,就是自己亲自去完成一件事件
异步,就是叫人代办,叫完人以后操作就返回,但是还不知道结果,等到那个人把事前办完了,才通过通知手段(回调函数等)通知你结果

阻塞与非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态

从线程的发出调用的角度看:
阻塞,是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞,指在不能立刻得到结果之前,该调用不会阻塞当前线程

从完成一件事前的角度看:
阻塞,就是在做一件事情的时候,在这一件事情还没有做完之前(还没有得到结果之前),不会做别的事情
非阻塞,就是在做一件事情的时候,你要做的事情已经完成了,但是还没有出结果,在等待结果的时候你去干别的事情

简单来说就是是否在等待一件事情的结果的时候去干别的事情

例子

下面用小霍烧水来形象地同步异步与阻塞非阻塞:

  1. 小霍用一个普通的水壶烧水,烧水期间,小霍一直看着烧水的情况,不做任何事情,直到水烧开了。这是同步阻塞
  2. 小霍用一个普通的水壶烧水,烧水期间,小霍拿着手机在看视频,但是小霍需要时不时地观察水烧开了没有(轮询)。这是同步非阻塞
  3. 小霍用一个带有提醒功能的水壶烧水(水烧开以后会有声音),烧水期间,小霍出去客厅看电视,当听到声音,小霍就去把火给关了。这是异步非阻塞

这里用带有提醒功能的水壶烧水,相当于你找人帮你看着烧水的情况,所以也可以算作是“叫人代办”。
这里没有讲异步阻塞的情况,是因为异步阻塞没有什么意义,讲到异步一般就是异步非阻塞。

下一篇,我们来讲一讲IO中的同步异步和阻塞非阻塞。

参考
怎样理解阻塞非阻塞与同步异步的区别?-知乎
深入理解同步/异步与阻塞/非阻塞区别

CATALOG
  1. 1. 同步与异步
  2. 2. 阻塞与非阻塞
  3. 3. 例子