1、同步与异步
同步与异步主要是从消息通知机制的角度来说的。
所谓同步就是说一个任务的完成需要依赖另一个任务,只有当被依赖的任务完成后,依赖的任务才能算完成,只是一种可靠的任务序列。所谓异步就是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。
当一个同步调用发出后,调用者要一直等待返回消息通知后,才能进行后续的执行;当一个异步调用发出后,调用者不能立刻得到返回消息,实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。如果使用状态来通知的话,那么调用者需要每隔一定时间检查一次,效率比较低;如果使用通知或者回调的方式,则效率很高。
2、阻塞与非阻塞
阻塞与非阻塞这两个概念与程序等待消息时的状态有关,也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的。
阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能执行其他业务。
非阻塞和阻塞的概念相反,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回,虽然表面上非阻塞可以明显提高CPU的利用率,但是也带来了另一种后果就是系统的线程切换增加。增加的CPU执行时间能不能补偿系统的切换成本需要好好评估。
很多人可能会把同步调用和阻塞调用等同起来,其实他们是不一样的:
对于同步调用来讲,很多当前线程可能还是激活的,只是从逻辑上讲当前函数没有返回而已,此时这个线程可能也会处理其他的消息,如果这个线程在等待当前函数返回的同时还在执行其他的消息处理,这种情况就叫做同步非阻塞,如果没有执行其他的消息处理,而是处于挂起等待状态,那么就叫做同步阻塞。
对于阻塞调用来讲,则当前线程就会被挂起等待当前函数退出。
综上所述,同步和异步仅仅是关注消息如何通知的机制,而阻塞和非阻塞是等待消息通知时的状态。也就是说在同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者,所以在异步机制中,处理消息者和触发机制之间就需要一个连接的桥梁。