0

0

Java并发编程中为什么要避免在循环中调用Thread.sleep_资源占用与等待精度的劣势

P粉602998670

P粉602998670

发布时间:2026-03-13 09:27:10

|

457人浏览过

|

来源于php中文网

原创

Thread.sleep()在循环中伤性能因频繁线程状态切换引发内核态调度开销,1000次1ms睡眠可能累积数百微秒延迟;LockSupport.parkNanos()更轻量但需配合unpark和状态检查使用。

java并发编程中为什么要避免在循环中调用thread.sleep_资源占用与等待精度的劣势

Thread.sleep() 在循环里为什么特别伤性能

因为每次调用 Thread.sleep() 都会触发线程状态切换:从 RUNNABLE 切到 TIMED_WAITING,再被 JVM 调度器唤醒切回 RUNNABLE。这个过程涉及内核态介入、上下文保存/恢复,不是纯用户态操作。高频循环中反复睡醒,CPU 时间大量耗在调度开销上,而不是干活。

  • 哪怕只睡 1ms,1000 次循环 ≈ 至少几百微秒实际调度延迟(尤其在负载高的机器上)
  • 如果循环体本身很轻(比如轮询一个标志位),Thread.sleep() 的开销可能比业务逻辑还高
  • JVM 不保证睡眠精度——Linux 下通常依赖 timerfdnanosleep(),但受系统负载、CFS 调度周期影响,实际唤醒可能延迟 10–50ms

替代方案:用 LockSupport.parkNanos() 更可控

LockSupport.parkNanos() 是 JVM 底层等待机制,不经过线程状态机全量切换,唤醒路径更短,精度也略好(仍不绝对精确,但抖动小)。它适合做“轻量级自旋+等待”混合策略。

  • 必须配合 LockSupport.unpark() 使用,不能单独当 sleep 替代品——它不释放 monitor,也不参与 synchronized 锁竞争
  • 常见误用:在无条件循环里直接 LockSupport.parkNanos(1_000_000),结果线程永远 park 住(没别的线程 unpark 它)
  • 正确姿势是和状态检查结合,比如:
    while (!ready) { LockSupport.parkNanos(100_000); }

真正该用 sleep 的场景其实很窄

只有当你明确需要「让出 CPU + 强制暂停一段可观测时间」时才该用 Thread.sleep(),比如模拟人工操作、限流降频、或调试时临时卡点。其他情况基本都有更好选择。

LLaMA
LLaMA

Meta公司发布的下一代开源大型语言模型

下载
  • 轮询共享变量?用 volatile + 自旋 + Thread.onSpinWait()(Java 9+)更合适
  • 等某个条件满足?优先用 CountDownLatchCondition.await()CompletableFuture,它们由 JVM 和 OS 协同优化唤醒
  • 定时任务?交给 ScheduledExecutorService,别自己 while + sleep 模拟
  • 注意:Thread.sleep(0) 并不“不睡”,它会让出当前时间片,但仍是完整状态切换,和 parkNanos(0) 行为不同

容易被忽略的兼容性细节

Thread.sleep() 在所有 Java 版本行为一致,但 park 系列方法在 JDK 8 和 JDK 11+ 有细微差异:JDK 11 后 parkNanos() 对极小值(如

立即学习Java免费学习笔记(深入)”;

  • 不要假设 parkNanos(1) 一定能停够 1 纳秒——它只是提示 JVM “尽量等这么久”,实际取决于系统时钟粒度(通常 10–15ms)
  • 在容器环境(尤其是 CPU limit 限制下的 Kubernetes Pod)里,Thread.sleep() 的唤醒延迟可能突然放大到 100ms+,而 park 相对稳定些
  • 如果代码要跑在 Android(Dalvik/ART)上,LockSupport 行为和 HotSpot 有差异,建议统一走 HandlerLooper 机制
真实项目里最麻烦的从来不是“怎么睡”,而是“凭什么认为现在该醒了”。状态同步、内存可见性、唤醒丢失——这些底层问题一旦混进 sleep 循环,debug 成本远高于换掉那一行 Thread.sleep()

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

107

2023.09.25

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

76

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

99

2025.12.01

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1564

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

716

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

300

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

800

2023.07.05

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 81万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号