同步异步和阻塞非阻塞

在实际开发中,经常会听到同步、异步、阻塞、非阻塞等概念,还可能遇到以下四种组合情况:

  1. 同步 + 阻塞
  2. 同步 + 非阻塞
  3. 异步 + 阻塞
  4. 异步 + 非阻塞

同步和异步

同步和异步是指: 请求发起方对消息结果的获取是主动发起的,还是等被动通知的。

  1. 请求方主动发起,一直在等待应答结果: 同步阻塞
  2. 请求方主动发起,先去处理其他的事情,但通过不断轮询查看发起的请求是否有应答结果: 同步非阻塞
  3. 由服务方通知,也就是请求方发出请求后,一直在等待通知:异步阻塞
  4. 由服务方通知,请求方发出请求后,就先去处理其他事情:异步非阻塞
    当事情处理完成之后,服务方会主动通知请求方,它的请求已经完成,这就是异步。异步通知的方式一般是通过状态改变,消息通知,或者回调函数来完成,大多数时候采用的都是回调函数。

阻塞和非阻塞

阻塞和非阻塞概念通常是和对于 IO 操作,如网络 IO 和磁盘 IO 等

阻塞和非阻塞通常形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。而非阻塞允许多个线程同时进入临界区。