同步、异步、阻塞、非阻塞这些概念

(一)同步与异步

  1. 同步和异步其实是指CPU时间片的利用,主要看请求发起方对消息结果的获取是主动发起的,还是被动通知的,如下图所示。如果是请求方主动发起的,一直在等待应答结果(同步阻塞),或者可以先去处理其他事情,但要不断轮询查看发起的请求是否有应答结果(同步非阻塞),因为不管如何都要发起方主动获取消息结果,所以形式上还是同步操作。如果有服务方通知的,也就是请求方发出请求后,要么一直等待通知(异步阻塞),要么先去干自己的事(异步非阻塞)。当事情处理完成后,服务方会主动通知请求方,它的请求已经完成,这就是异步。异步通知的方式一般通过状态改变、消息通知或者回调函数来完成,大多数时候采用的都是回调函数。
    同步、异步、阻塞、非阻塞这些概念_第1张图片

(二)阻塞与非阻塞

  1. 阻塞和非阻塞在计算机的世界里,通常指针对I/O的操作,如网络I/O和磁盘I/O等。那么什么是阻塞和非阻塞呢?简单地说,就是我们调用了一个函数后,在等待这个函数返回结果之前,当前的线程是处于挂起状态还是运行状态。如果是挂起状态,就意味着当前线程什么都不能干,就等着获取结果,这就是同步阻塞;如果仍然是运行状态,就意味着当前线程是可以继续处理其他任务的,但要时不时地看一下是否有结果了,这就是同步非阻塞。具体如下图所示。
    同步、异步、阻塞、非阻塞这些概念_第2张图片

(三)举例-实际生活场景

1). 同步、异步、阻塞和非阻塞可以组合成上面提到过的四种结果。
  举个例子,比如我们去照相馆拍照,拍完照片之后,商家说需要30min左右才能洗出来照片。
  (1)这个时候,如果我们一直在店里面什么都不干,一直等待直到洗完照片,这个过程就叫同步阻塞。
  (2)当然,大部分人很少这么干,更多的是大家拿起手机开始看电视,看一会儿就会问老板洗完没,老板说没洗完,然后接着看,再过一会儿接着问,直到照片洗完,这个过程就叫同步非阻塞。
  (3)由于店里生意太好了,越来越多的人过来拍,店里面快没地方坐了,老板说你把手机号留下,我一会儿洗好了就打电话告诉你过来取,然后你去外面找了一个长凳开始躺着睡觉等待老板打电话,什么都不干,这个过程就叫异步阻塞(实际不应用)。
  (4)当然实际情况是,大家可能会先去逛街或者吃饭,或者做其他活动,这样一来,两不耽误,这个过程就叫异步非阻塞(效率最高)。

(四)小结

从上面的描述中,我们能够看到阻塞和非阻塞通常是指在客户端发出请求后,在服务端处理这个请求的过程中,客户端本身是直接挂起等待结果,还是继续做其他的任务。而异步和同步则是对于请求结果的获取是客户端主动获取结果,还是由服务端来通知结果。从这一点来看,同步和阻塞其实描述的是两个不同角度的事情,阻塞和非阻塞指的是客户端等待消息处理时本身的状态,是挂起还是继续干别的。同步和异步指的是对于消息结果是客户端主动获取的,还是由服务端间接推送的。记住这两点关键的区别将有助于我们更好地区分和理解它们。

以上文章记录于《Netty4核心原理与手写RPC框架实战》

你可能感兴趣的:(网络编程,JAVA基础篇,JAVA高级篇,网络,java,开发语言)