一文讲清楚 同步、异步、阻塞和非阻塞

  • 原创
  • 发布时间: 6个月前
  • 收藏数: 0 / 点赞数: 0 / 阅读数: 129

同步、异步、阻塞和非阻塞这些方式并不好理解,下面简单解释这些术语的概念:

同步:

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。

按照这个定义,其实绝大多数函数都是同步调用。

异步:

异步的概念和同步相对。当一个异步调用发出后,调用者不能立即得到结果。

实际处理这个调用的函数在完成后,通过状态、通知或回调来通知调用者。

阻塞:

阻塞是指调用结果返回之前,当前线程会被挂起,函数只有在得到结果之后才会返回。

有人也许会把阻塞调用和同步调用等同起来,实际上它们是不同的。

对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

非阻塞:

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

 

看完概念介绍,可能我们还是无法理解它们的函数,下面举例进行对比:

 

同步:

当我们去银行的AMT机取钱,需要排队,只有排到时才能取,也就是我们为了取钱,一直处于排队等待的状态,需要时刻关注是否排到了自己。

异步:

在银行的大厅取钱,可以先领取一个号码,然后在座位上等待,广播通知号码时再去柜台取钱。

 

阻塞和非阻塞,这两个概念与等待消息时的状态有关,无所谓同步或者异步

阻塞:

当我们等待取钱时,如果不能做其他事情,比如不能打电话、发短信,就是阻塞。

非阻塞:

当我们等待取钱时,如果可以做其他事情,比如打电话、发短信,就是非阻塞。

 

很明显,同步和异步对象,阻塞和非阻塞对应,它们可以组成四种调用方式,同步阻塞同步非阻塞异步阻塞异步非阻塞

但异步阻塞实际上是没有的,这种方式也没有意义。

评论