同步/异步;阻塞/非阻塞
从程序的进程方面来说
同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态
。以小明下载文件打个比方,从这两个关注点来再次说明这两组概念,希望能够更好的促进大家的理解。
- 同步阻塞:小明一直盯着下载进度条,到 100% 的时候就完成。
同步体现在:等待下载完成通知;
阻塞体现在:等待下载完成通知过程中,不能做其他任务处理;
- 同步非阻塞:小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。
同步体现在:等待下载完成通知;
非阻塞体现在:等待下载完成通知过程中,去干别的任务了,只是时不时会瞄一眼进度条;【小明必须要在两个任务间切换,关注下载进度】
- 异步阻塞:小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音(看起来很傻,不是吗)。
异步体现在:下载完成“叮”一声通知;
阻塞体现在:等待下载完成“叮”一声通知过程中,不能做其他任务处理;
- 异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。
异步体现在:下载完成“叮”一声通知;
非阻塞体现在:等待下载完成“叮”一声通知过程中,去干别的任务了,只需要接收“叮”声通知即可;【软件处理下载任务,小明处理其他任务,不需关注进度,只需接收软件“叮”声通知,即可】
以上摘自聊聊同步、异步、阻塞与非阻塞
然而对于JavaScript来说:
*JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?*(摘自阮老师的博客)
由于JavaScript的单线程,决定了js其实不存在所谓的“同步”,‘异步’,有的只是
‘阻塞模式’--如回调函数,在主函数没有执行完毕的时候,无法执行回调函数里面的代码
和‘非阻塞模式--如通常的“异步ajax请求”