同步/异步 和 阻塞/非阻塞 之间具有相关性,通常情况下为 同步阻塞 以及 异步非阻塞 ,所以很容易把同步和阻塞混淆,把异步和非阻塞混淆。
其实,同步包括了 同步阻塞 和 同步非阻塞 ,异步也包括了 异步阻塞 和 异步非阻塞 。我先简单介绍阻塞/非阻塞的概念,然后分别对应到同步/异步的情况中。(如果我的理解有误,请帮我指出,感激不尽)
阻塞/非阻塞:
阻塞和非阻塞关注的是程序(线程)在执行过程中调用了另一个程序,在等待调用结果(消息,返回值)时的状态。
阻塞:指调用结果返回之前,当前线程会被挂起,不能进行后续操作。
非阻塞:指调用结果返回之前,当前线程还可以继续进行后续操作。
同步和异步:
同步和异步则关注任务(线程)之间的一种消息通信机制或是一种协作方式。
同步:指的是一个任务在执行过程中调用了另一个任务并依赖于它的返回结果,在没有得到返回结果前该任务不会返回(结束)。
此时,若该任务在等待返回结果的过程中不能继续执行后续操作,只是在等待的话,则称之为同步阻塞;若该任务在等待返回结果的过程中可以继续执行后续操作,只是不能返回(结束)的话,则称为同步非阻塞。
异步:指的是一个任务在执行过程中调用了另一个任务,但只告诉另一个任务如何执行,而不依赖它的返回结果,该任务可以先返回(结束)。
类似的,此时若任务不能继续执行后续操作则称为异步阻塞;若可以继续执行后续操作则称为异步非阻塞,执行完后可以先返回。
如何区别:
个人认为区别阻塞/非阻塞和同步/异步的关键是:
阻塞/非阻塞关注的是任务(线程)在调用其他任务后是否被挂起,还能否继续执行其他操作,能的话为非阻塞,不能的话为阻塞。
同步/异步关注的是任务(线程)在调用其他任务后是否能先返回(结束),能先结束的话为异步,不能的话为同步。