同步和异步是对相,阻塞与非阻塞也是相对的,这个好理解,但这两组术语之间怎么区分,或者有什么联系,从字面上确实有点绕,但从场景和使用出发还是很好理解的,虽是不同层次上的描述,但还是有一定制约的。这里的同步和阻塞并非指java中的锁相关概念。
使用场景
- 阻塞和非阻塞的术语一般用在IO操作上,线程操作也有用到
- 同步和异步的术语一般用在业务接口调用上或者业务描述上
狭义的理解:
- 阻塞和非阻塞就是指IO的工作模式,阻塞需独占线程
- 同步和异步指的接口提供的调用方式,同步需独占线程
广义的理解
- 阻塞和非阻塞是针对服务提供者来说的,或者说是针对实现来说的
- 同步和异步是对针对服务消费者来说的,或者说是针对上层调用来说的
- 业务接口提供方,提供的是阻塞的调用方式,那么调用方没有选择,只能是同步调用。
- 业务接口提供方,提供的是非阻塞的调用方式,那么该业务自然才用异步的调用方式。
本质
- 从计算机本身出发,其本质就是CPU为该事情分配的执行机会有没有被浪费掉,浪费掉了就是阻塞和同步,否则就是非阻塞和异步。
- CPU的执行机会指的线程调度的机会。由于该事情还没准备好,该线程被分配了执行时间,它也没办法执行。这就是阻塞和同步的,如果阻塞和异步的,那么该线程可以去做别的事。
场景经常有如下
- 调用业务接口执行某项业务时,直接返回业务结果。那么它是(业务)同步的(调用)阻塞的。
- 调用业务接口时,只返回调用是否成功,但没返回业务结果,需要另外一种方式,比如回调或者按频率尝试获取结果等。那么它是(业务)异步(调用)非阻塞的。
- IO操作时,阻塞和非阻塞术语会经常用到,比如阻塞模式和非阻塞模式
- 同步调用业务接口时,有可能是由于该接口在进行阻塞的IO操作引起起的,也有可能,也有可能是别的原因,比如在等别一个线程的执行结果。
- 异步调用业务口时,也有可能该接口使用了另一个线程在进行阻塞的IO操作,待有结果后再回调上层进行通知。
生活场景
- 某个人A(相当于一个线程)去中国银行办理业务,如果银行要求必须在窗口前排队挨个进行服务办理,那么银行提供的就是阻塞似的服务,这个人就必须这么耗着,不能离开去办别的事,那么A只能采用同步方式办理这个业务。
- 下次A又需要去中国银行办理同样的业务了,这次他学乖了,自己不去,而是让B去,那么A采用了异步的方式来办理该业务了。这回B傻眼了。
- 又有一次A要去招商银行办理业务,这次B也长教训了,不愿意去,只好骗C去了,招商银行不要求窗前排队,只要求在门口拿个号就行了,到时叫号办理,C发现前面还有好多人,如是去外面泡脚去了,回去找A报销,说排队排到脚痛,不泡脚不行呀。这回银行提供的是非阻塞的服务,A和C都是民步办理了业务。