同步异步和阻塞非阻塞
很多时候会涉及到同步、异步、阻塞、非阻塞的考虑,这四种调用方式容易混淆或者不清晰,这里大致了解下他们的的概念及区别。
同步异步
同步异步关注的是通信机制
同步
调用开始后,调用者必须等待被调用方法完成返回结果后,才能继续执行后续的操作。
例1:打电话预定酒店,接线员让请等待,然后查询是否满足,查询到结果后告诉了你(返回结果),这样才挂断电话。
异步
调用开始后,会立即返回,继续执行后续的操作。不需要等待调用结果。当被调用方法完成后,通过callback函数或其他方法通知执行结果。
异步方法通常会在另外一个线程中,不会阻塞调用者的执行。
例2:打电话预定酒店,接线员说知道了 等查询好了告诉你,然后通话结束。酒店查询完成后,回电(callback)告诉你相关结果。
阻塞非阻塞
阻塞和非阻塞形容多线程间的相互影响,关注的是调用者在等待结果时的程序状态
阻塞
阻塞调用,调用结果返回前,当前进程会被挂起。一直等待中,无法执行其他操作。等待中什么都没干。
例3:打电话预定酒店,酒店去查询是否满足,这个过程你啥都没干,等待直到查询好结果告诉了你挂断电话。
非阻塞
非阻塞调用,即使没有立即返回结果,当前线程也不会被挂起。
例4:打电话预定酒店,接线员说知道了,然后通话结束。这个过程你开始做其他事。只是每隔几分钟询问一下是否有结果。
总而言之,同步不等于阻塞,异步不等于非阻塞,不是同一个概念。
同步可能是阻塞,也可能非阻塞。如上述例子中例3 例4:例3-是阻塞的(一直等待知道最终结果),例4-是非阻塞的(每次都是有获得结果,只是在获得需要结果前每隔一段时间检查一次)
善始者实繁,克终者盖寡。
---不足或不对的地方欢迎指正。