javaWeb中的异步与同步
异步与同步在不同场景有许多含义,本文以web为例简要对比并总结相关知识。
web同步加载
- 内容:浏览器阻塞后续任务,对当前页面或资源进行解析或加载,或图像渲染。
- 特点:服务器与浏览器保持任何方面的信息一致,浏览器状态即服务器状态,且都是最新状态。
- 应用:对于需要获取结果再进行操作的任务需要进行同步加载。对于实时操作或安全性要求高的任务需要同步加载。
web异步加载
- 范例:Ajax:局部刷新,局部加载
- 内容:浏览器获取当前页面静态文件加载,部分内容在同一请求中随后加载
- 特点:浏览器与服务器信息状态不一致,任务提交不一定执行,浏览器继续进程不一定依靠任务结果,服务器不一定是最新状态。
- 应用:结果对接下来任务影响不明显的任务可用异步,安全性不高的任务可以用异步,同步执行开销太大可以用异步。
总结
同步与异步是一种思想问题。在模型中可以用瀑布模型和并发模型类比。也可以说是单线程和多线程的类比。核心问题是消息传递的时机与方式,在不同问题中时机和方式各不相同。同步需要客户端等待信息更新再执行下一步的任务,提交则意味着任务必定执行且得到结果。而异步的客户端可以一次提交多个任务,也可以在任务提交后进行其他任务,已提交任务的反馈决定权不在客户端手里,得到答案的时机和是否得到答案都由服务端确定。异步机制也许满身优点,但相对来说,同步可能意味着简单的问题,简单的技术以及简单的消息,而异步可能意味着相对复杂的事情。显而易见,对于同步来说,需要考虑的问题比较少,比如:
- 等待消息的时间成本是否需要花费?
- 等待消息的空间成本是否需要花费?
而异步的问题比较多,比如:
- 单个消息反馈是否有延迟?时间成本是否合理?
- 单个消息反馈是否影响后续任务的执行?影响程度有多少?
- 消息反馈的技术实现是否能够接受?
- 多个任务同时或间隔不大提交消息反馈的是否有延迟?时间成本是否合理?
- 多个消息的反馈顺序和内容是否会相互影响?
……
某方面的简约可能代价是许多方面的复杂。毫无疑问同步与异步的选择需要考量,要结合,要包容。