同步和异步

同步和异步通常用来形容方法的调用方式。

同步方法表明调用一旦开始,调用者必须等待方法执行完成,才能继续执行后续方法。

异步方法表明,方法一旦开始,立即返回,调用者无需等待其中方法执行完成,就可以继续执行后续方法。
通常我们写的方法都是同步方法,方法间执行都是串行化的,在一个线程内运行。

我们举一个小例子:
你和朋友去吃饭,你们到达饭店,点了一桌满汉全席。由于你们饿的不行,就在饭店等待厨师做好菜,等菜上桌。你和你的朋友吃完饭,付了钱,舒舒服服的去商场购物了,一次饭局就结束了。这就是同步调用。

如今,我们正处在互联网时代,当你们饿的时候,就打开饿了么,点了一桌满汉全席,支付了餐费,这时你就完成了点菜。商家接到了你的订单之后,就会马上开始安排(毕竟顾客就是上帝嘛)。现在你们无须默默等待,以免被饿所折磨,于是你们打开了京东,开始了新的购物。当饿了么小哥饭菜送到时,一签单就完事了,并且你们也完成了购物。这就是异步调用。

我们使用代码表示:
public static void eatMeal() {
System.out.println("点了一桌满汉全席,快来吃啊。。。");
try {
//模拟等待上菜时间
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("饭已吃完,饭局结束。");
}

public static void shop() {
System.out.println("我们可以开始购物了。");
}


public static void main(String[] args) {
eatMeal();
shop();
}
执行结果:按着上下文顺序,依次执行。典型的同步调用方式。


现在我们修改一下eatMeal()方法,改为异步方式,通常使用线程开启异步。
另外springboot中可以使用(@EnableAsync和@Async)开启异步模式。



执行结果:使用异步方式,我们可以把耗时的操作,放在另外一个线程之中,提高程序性能。


这个例子不是特别的好。通常在业务需求中,当上下文内容没有关联的时候,上一个操作比较耗时,我们无需等待上一个执行结束才开始下一个执行,我们就可以使用异步方式,提高响应速度,进而提高程序性能。




### 同步机制异步机制的区别及应用 #### 同步机制 同步机制是指任务按照顺序依次执行,一个任务的开始必须等待前一个任务完成。在同步模式下,程序会阻塞当前线程,直到某个操作完成,这通常会导致资源利用率较低,但逻辑清晰、实现简单。例如在同步通信中,发送方必须等待接收方的响应后才能继续执行下一步操作[^2]。 同步机制适用于对执行顺序有严格要求的场景,如金融交易系统中的事务处理,必须确保每一步操作都完成后再进行下一步,以保证数据的一致性完整性。此外,同步机制也常用于简单流程控制,例如单线程程序中的函数调用链[^4]。 ```python def sync_task(): result = sync_operation() print(f"Operation result: {result}") def sync_operation(): # 模拟同步操作 return "Success" ``` #### 异步机制 异步机制则允许任务在等待某个操作完成的同时继续执行其他任务。在异步模式下,程序不会阻塞当前线程,而是通过事件驱动或回调机制处理任务结果。这种方式提高了资源利用率,尤其适用于高并发I/O密集型任务[^4]。 异步机制广泛应用于网络编程、用户界面响应、实时数据处理等领域。例如,在Web开发中,服务器可以使用异步I/O处理多个客户端请求,避免因等待数据库查询或磁盘读写而阻塞整个服务。现代编程语言如JavaScript、Python、C#等都提供了异步编程模型(如async/await)来简化异步任务的管理[^3]。 ```python import asyncio async def async_task(): result = await async_operation() print(f"Operation result: {result}") async def async_operation(): # 模拟异步操作 await asyncio.sleep(1) return "Success" asyncio.run(async_task()) ``` #### 核心区别 同步异步的核心区别体现在执行方式、控制流、资源利用率适用场景上。同步执行方式是顺序的,任务之间存在阻塞;而异步则是并发的,任务之间不阻塞。同步控制流是线性的,而异步控制流是事件驱动或回调机制。同步资源利用率较低,存在等待时间;异步资源利用率较高,无等待时间。同步适用于简单流程强顺序性要求的场景;异步则适用于I/O密集型高并发需求的场景[^4]。 #### 线程的关系 同步异步线程模型密切相关。在多线程环境下,同步任务可以通过多个线程并行执行,但仍需通过锁、信号量等机制保证顺序性;而异步任务通常由事件循环调度,多个任务共享一个或多个线程,通过非阻塞I/O实现高效的并发处理[^1]。 #### 误区澄清 一个常见的误区是认为异步总是比同步快,实际上异步的优势在于资源利用率响应能力,而不是单个任务的执行速度。另一个误区是认为多线程就是异步,但实际上异步可以基于事件循环、协程等多种机制实现,不一定依赖多线程[^3]。 #### 正确的理解总结 同步机制适用于逻辑简单、顺序性强的场景,实现直观但容易造成阻塞;异步机制适用于高并发、I/O密集型任务,能显著提升系统吞吐量响应能力,但实现复杂度较高。理解同步异步的本质区别,有助于在实际开发中合理选择任务执行模型,从而优化系统性能用户体验[^2]。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值