浅谈阻塞/非阻塞、同步/异步
–从linux IO系统调用出发
阻塞与非阻塞主要从进程/线程的角度出发:
- 阻塞(blocking):教科书年年考的概念——调用方(主线程)发起调用之后挂起直到被调用方法返回。阻塞通信仍然有很多应用场景,典型例子如如spring框架下传统的Spring MVC的Servlet Stack;(如下图)
- 非阻塞(non-blocking):相对阻塞而言,调用方发起调用之后,不会挂起,而是马上继续执行调用块之后的逻辑。
而同步与异步主要从通信的角度出发:
- 同步(synchronous):同步机制是指发送方发送请求后,需要等待接收到接收方发回的响应后,才接着发送下一个请求。所以,发送方和接收方对请求的处理步调是一致的;
- 异步(asynchronous):发送方发出一个请求后,不等待接收方响应这个请求,就继续发送下个请求;接收方处理完成后通知发送方,二者步调不一致。
引用知乎大神的话:这两对概念有一定的区别,不能混淆。两对概念的组合,就会产生四个新的概念,同步阻塞、异步阻塞、同步