在日常工作中,我们常常会遇到同步、异步、阻塞和非阻塞这些名词,并且很可能的会把他们的概念混淆掉,这里就聊聊他们之间的联系和区别以加深理解。

首先说一说阻塞和非阻塞,这两个概念其实是比较好理解的,所谓阻塞就表示在某一个时间内,某一个进程或操作等等,处于等待状态,在这个等待状态结束之前,不可以继续接下来的操作;而非阻塞就是在某一个时间,我们不需要傻傻的等待,而可以去做其他的事情,很明显,非阻塞方式解放了生产力,提升了效率。

而同步和异步这两种方式,则主要是体现在了消息的处理机制上面。简单来说,同步是一种主动询问的消息处理机制,即当程序运行时,我们需要不间断的、反复的去询问程序的运行状态,调用者为了得到这个调用结果,必须不停的从被调用者处获取最新状态;而异步的处理机制则完全不一样,在调用者发出了调用申请之后,不需要去反复询问被调用者当前的运行状态,相反,被调用者在程序执行到指定的状态的时候,会主动的给调用者发送一条消息,报告自己已经达到了某种的运行状态,这就是异步操作的方式。

注:除了以上几个,我们可能还听过回调,其实,回调只是异步的实现手段之一。一般来说,我们可以把程序分为系统程序和用户程序,系统程序为用户程序提供API,用户程序调用系统程序提供的API来实现所需要的功能。但是在某些时候,我们可以这样做:在系统程序中设置一个函数指针,之后在用户程序中实现一个函数,用户可以把用户程序传回给系统程序,系统程序把函数指针指向用户自定义的函数,从而导致用户程序的执行。这就导致了一种非常有意思的现象:一般说来,都是用户程序调用系统程序的函数,而在上一种情况中;很明显,是系统程序调用(严格来说应该不能称之为调用)了用户程序中所定义的函数,即可以指定系统程序在特定时间执行自定义的客户程序,这种现象就是回调。

参考:聊聊同步、异步、阻塞与非阻塞