同步和异步、阻塞和非阻塞

1、概念

同步和异步关注的是消息通信机制,表示的是被调用者处理事件的行为方式
同步就是指我们的调用者发送一个调用,被调用者不会立刻返回,当然如果返回了,那就是调用者想要的东西。异步就是:被调用者会立刻返回,但是返回可能不是调用者想要的数据,而可能是数据是否准备好的状态。
如果调用者想要的数据准备好后,根据被调用者内部实现机制的不同,被调用者会使用状态、通知和回调三种方式告知调用者。(1)使用状态的方式,调用者和被调用者之间可能会共享一个变量,调用者需要自己主动去查看这个变量的值,这是很低效的;(2)使用通知或者回调的方式,被调用者会主动通知调用者,这是高效的实现方式

阻塞和阻塞关注的是程序在等待调用结果时所处的状态,表示的是调用者的状态
阻塞模式表示调用者发出一个调用之后,把自己挂起等待被调用者的返回,不去干别的事,非阻塞模式表示调用者在等待消息通知之前自己会去干别的事

  举个例子:
  例子中挂电话是一次返回的行为,挂电话之前说的话就是返回值。
(1)同步和异步

A打电话向B借《Netty实战》这本书,B接到电话后,短时间一直没有给回音,大概过了n久B终于说话了,“好的,明天给你!”并挂断电话,这就是同步,这里B接到电话没有立即给回音,当然给了回音就是肯定的回音

另一种情况,A打电话向B借《Netty实战》这本书,B接到电话后立刻返回,“没有找到书”,于是就挂了电话。那么B找到了书之后怎么告知A呢:

  • B和A约定,在A、B都可见的位置挂一面红旗表示书找到了,B挂了红旗之后,A是否能及时看到就很难说了,所以A只能自己主动去查看
  • B找到书之后,主动打电话给A(我们这里就假设B打了电话A肯定能及时接到啦),A就可以及时接到书找到的通知啦,这个就很高效。

(2)阻塞非阻塞
同样还是上面的例子,但是这里我们只关注A的状态。
A在等待B的消息时(很有可能是B没有回音的同步的消息,也有可能是B已经挂断了并主动打电话过来的异步的消息),A如果选择一直守在电话旁边,啥事也不干,那就是阻塞方式,相反,如果A在等待的时候跑去干别的事了,那就是非阻塞。

2、各种状态说明

接下来对同步阻塞、同步非阻塞、异步阻塞、异步非阻塞分别说明。
其实理解了 上面的概念,对于这些组合是很好理解的,就是排列组合嘛
(1)同步阻塞
B一直没有回音,A只能在电话这边苦苦等待
(2)同步非阻塞
B一直没有回音,A去干别的事,当然A可以选择一些方式来看一下B是否有回音,比如定时轮询
(3)异步阻塞
B返回了“没有找到书”的消息,A于是就傻傻的等待B的电话
(4)异步非阻塞
B返回了“你让我找找,找到了我打电话告诉你”的消息,A选择一些方式来看一下B是否来了电话或者B是否挂了红旗,比如定时轮询

猜你喜欢

转载自blog.csdn.net/u014473112/article/details/80793274