同步和异步
同步和异步关注的是消息通信机制
同步:发出一个请求后,再没有得到结果之前,该请求就不返回,一旦请求返回就有了请求结果(请求者主动等待这个请求)
例子:到书店买书,你问老板有没有《JS高程》,老板说我给你找找,你等等,然后过了好久查到了告诉你结果
异步: 发出一个请求后,请求直接返回,但是没有请求结果。然后过一段实践通知你请求结果(异步请求发出后,不会立刻有结果,而是等到请求发出后,被请求者通过状态或者通知、回调函数等来处理这个请求,告诉你请求结果)
例子:到书店买书,问老板有没有《JS高程》,老板说我给你找找,你先看会其他的书,等找到了我告诉你,然后查好了,老板会来通知你
阻塞和非阻塞
阻塞和非阻塞关注的是程序在等待调用结果时的状态
阻塞:指请求结果返回前,当前进程会不会被挂起,调用当前线程只有在请求结果返回之后。
例子:到书店买书,问老板有没有《JS高程》,老板说我给你找找,你等啊等(等待的过程你什么都不做),一直等到老板告诉你结果你才动
非阻塞:指请求结果返回之前,当前进程不会被挂起,还可以做其他的
例子:到书店买书,问老板有没有《JS高程》,老板说我给你找找,在等待的过程你又去看了其他的书,一直等到老板告诉你结果你才动
总结
所以可以看到同步和异步与阻塞和非阻塞是两个不同的概念,前者关注的是通知机制,后者关注的是过程,所以同步阻塞和同步非阻塞、异步阻塞和异步非阻塞等概念是有些许不清楚的。
比如一段同步代码阻塞了,这时候阻塞的对象仅仅是当前线程,可是浏览器或者操作系统有多个线程,其他线程并没有阻塞,所以从操作系统或者浏览器的层面来看,是会有同步非阻塞的。但是永远不会有异步阻塞的情况
参考资料: