线程阻塞调用与同步调用的区别

一、核心

  • 同步调用:调用方必须等被调用方"完成"后才能继续执行。

  • 线程阻塞调用:调用方在等待结果时,线程被挂起(不占用 CPU),直到条件满足再被唤醒。

也就是说:

同步调用关注"调用方式",线程阻塞关注"线程状态"。

二、它们不是同一个维度的概念

你可以把它们理解成:

  • 同步 / 异步:描述"调用方是否需要等待结果"。

  • 阻塞 / 非阻塞:描述"等待时线程是否被挂起"。

因此会出现四种组合:

  1. 同步阻塞(最常见)

例:Java 的 Thread.sleep() 、 Object.wait() 、 Socket.accept()

  1. 同步非阻塞

例:轮询一个标志位,线程不挂起但一直检查。

  1. 异步阻塞(很少见)

例:异步回调在另一个线程执行,但主线程调用 Future.get() 阻塞等待结果。

  1. 异步非阻塞(高性能网络常用)

例:Netty、NIO、JavaScript Promise、Go 的 goroutine + channel。

三、用生活例子快速理解

你去咖啡店点咖啡:

  1. 同步调用

你点完单后,必须等咖啡做好才能离开柜台。

  1. 线程阻塞调用

你点完单后,店员让你"坐着等叫号",你不需要一直站在柜台前,但你也不能去做别的事,只能等。

  1. 异步调用

你点完单后,店员给你一个取餐码,你可以去逛街,等咖啡好了再回来取。

  1. 非阻塞

你不等店员叫号,自己每隔几秒去柜台看一下"好了没"。

四、技术层面的更细解释

同步调用的特点

  • 调用方和被调用方在同一个执行流程中。

  • 调用方必须等待被调用方返回。

  • 是否阻塞取决于实现。

例:

java

int result = add(1, 2);

System.out.println(result); // 必须等 add 返回

线程阻塞调用的特点

  • 线程由操作系统挂起(进入 BLOCKED/WAITING 状态)。

  • 不占用 CPU。

  • 通常发生在等待 I/O、锁、条件变量、睡眠等场景。

例:

java

synchronized (lock) {

lock.wait(); // 当前线程阻塞,直到被 notify

}

五、为什么很多人会混淆?

因为大多数同步调用在底层实现上都会阻塞线程,所以大家会把"同步"和"阻塞"当成同义词。

但它们本质不同。

例如:

  • 同步但不阻塞:

你循环检查一个变量,不挂起线程。

  • 异步但阻塞:

你发起一个异步任务,但你立刻调用 future.get() 阻塞等待结果。

相关推荐
碎梦归途4 小时前
思科网络设备配置命令大全,涵盖从交换机到路由器的核心配置命令
linux·运维·服务器·网络·网络协议·路由器·交换机
小天源5 小时前
nginx在centos7上热升级步骤
linux·服务器·nginx
AZ996ZA5 小时前
自学linux第十八天:【Linux运维实战】系统性能优化与安全加固精要
linux·运维·安全·性能优化
大虾别跑6 小时前
OpenClaw已上线:我的电脑开始自己打工了
linux·ai·openclaw
weixin_437044646 小时前
Netbox批量添加设备——堆叠设备
linux·网络·python
hhy_smile7 小时前
Ubuntu24.04 环境配置自动脚本
linux·ubuntu·自动化·bash
宴之敖者、7 小时前
Linux——\r,\n和缓冲区
linux·运维·服务器
LuDvei7 小时前
LINUX错误提示函数
linux·运维·服务器
未来可期LJ7 小时前
【Linux 系统】进程间的通信方式
linux·服务器
Abona7 小时前
C语言嵌入式全栈Demo
linux·c语言·面试