目录
1, 同步
2, 异步
3, 同步与异步的区别
4, 阻塞与非阻塞
5, 阻塞非阻塞与同步异步的区别?(故事篇)
1, 同步
所谓同步, 就是发出一个功能调用时, 在没有得到结果之前, 该调用就不返回或继续执行后续操作.
简单来说, 同步就是必须一件一件事做, 等前一件做完了才能做下一件事.
例如: B/S 模式中的表单提交, 具体过程是: 客户端提交请求 ->等待服务器处理 ->处理完毕返回, 在这个过程中客户端 (浏览器) 不能做其他事.
2, 异步
异步与同步相对, 当一个异步过程调用发出后, 调用者在没有得到结果之前, 就可以继续执行后续操作. 当这个调用完成后, 一般通过状态, 通知和回调来通知调用者. 对于异步调用, 调用的返回并不受调用者控制.
对于通知调用者的三种方式, 具体如下:
状态
即监听被调用者的状态(轮询), 调用者需要每隔一定时间检查一次, 效率会很低.
通知
当被调用者执行完成后, 发出通知告知调用者, 无需消耗太多性能.
回调
与通知类似, 当被调用者执行完成后, 会调用调用者提供的回调函数.
例如: B/S 模式中的 Ajax 请求, 具体过程是: 客户端发出 Ajax 请求 ->服务端处理 ->处理完毕执行客户端回调, 在客户端 (浏览器) 发出请求后, 仍然可以做其他的事.
3, 同步与异步的区别
总结来说, 同步和异步的区别: 请求发出后, 是否需要等待结果, 才能继续执行其他操作.
4, 阻塞与非阻塞
阻塞和非阻塞这两个概念与程序 (线程) 等待消息通知 (无所谓同步或者异步) 时的状态有关. 也就是说阻塞与非阻塞主要是程序 (线程) 等待消息通知时的状态角度来说的.
阻塞和非阻塞关注的是程序在等待调用结果 (消息, 返回值) 时的状态.
阻塞调用是指调用结果返回之前, 当前线程会被挂起. 调用线程只有在得到结果之后才会返回.
非阻塞调用指在不能立刻得到结果之前, 该调用不会阻塞当前线程.
5, 阻塞非阻塞与同步异步的区别?(故事篇)
理解同步阻塞, 同步非阻塞, 异步阻塞, 异步阻塞, 异步非阻塞
同步 / 异步关注的是消息通知的机制, 而阻塞 / 非阻塞关注的是程序 (线程) 等待消息通知时的状态.
以小明下载文件打个比方, 从这两个关注点来再次说明这两组概念, 希望能够更好的促进大家的理解.
同步阻塞: 小明一直盯着下载进度条, 到 100% 的时候就完成.
同步体现在: 等待下载完成通知.
阻塞体现在: 等待下载完成通知过程中, 不能做其他任务处理.
同步非阻塞: 小明提交下载任务后就去干别的, 每过一段时间就去瞄一眼进度条, 看到 100% 就完成.
同步体现在: 等待下载完成通知.
非阻塞体现在: 等待下载完成通知过程中, 去干别的任务了, 只是时不时会瞄一眼进度条.[小明必须要在两个任务间切换, 关注下载进度]
异步阻塞: 小明换了个有下载完成通知功能的软件, 下载完成就 "叮" 一声. 不过小明不做别的事, 仍然一直等待 "叮" 的声音.
异步体现在: 下载完成 "叮" 一声通知.
阻塞体现在: 等待下载完成 "叮" 一声通知过程中, 不能做其他任务处理.
异步非阻塞: 仍然是那个会 "叮" 一声的下载软件, 小明提交下载任务后就去干别的, 听到 "叮" 的一声就知道完成了.
异步体现在: 下载完成 "叮" 一声通知.
非阻塞体现在: 等待下载完成 "叮" 一声通知过程中, 去干别的任务了, 只需要接收 "叮" 声通知即可.[软件处理下载任务, 小明处理其他任务, 不需关注进度, 只需接收软件 "叮" 声通知, 即可]
也就是说, 同步 / 异步是 "下载完成消息" 通知的方式(机制), 而阻塞 / 非阻塞则是在等待 "下载完成消息" 通知过程中的状态(能不能干其他任务), 在不同的场景下, 同步 / 异步, 阻塞 / 非阻塞的四种组合都有应用.
所以, 综上所述, 同步和异步仅仅是关注的消息如何通知的机制, 而阻塞与非阻塞关注的是等待消息通知时的状态. 也就是说, 同步的情况下, 是由处理消息者自己去等待消息是否被触发, 而异步的情况下是由触发机制来通知处理消息者, 所以在异步机制中, 处理消息者和触发机制之间就需要一个连接的桥梁. 在小明的例子中, 这个桥梁就是软件 "叮" 的声音.
来源: https://www.cnblogs.com/luyuze95/p/11520945.html