0

0

在Java中为什么会发生饥饿问题_Java线程饥饿的触发原因说明

P粉602998670

P粉602998670

发布时间:2025-12-09 08:41:03

|

788人浏览过

|

来源于php中文网

原创

线程饥饿本质是某线程长期得不到cpu执行机会,主因包括高优先级线程抢占、非公平锁插队、无限等待无超时及线程池任务丢弃;需通过降优先级、用公平锁、设超时、调优拒绝策略等预防。

在java中为什么会发生饥饿问题_java线程饥饿的触发原因说明

Java中发生线程饥饿,本质是某个(或某些)线程长期得不到CPU执行机会,不是它不活跃,而是调度机制或代码逻辑让它“永远排在后面”。这和死锁不同——饥饿线程没被阻塞,只是始终轮不到运行。

高优先级线程持续抢占CPU

Java支持线程优先级(1–10),但JVM不保证严格遵循。不过在某些操作系统(如Windows)或特定JVM实现中,高优先级线程可能频繁被调度,导致低优先级线程长时间无法获得时间片。尤其当高优先级线程处于计算密集型循环、且未主动让出(如不调用Thread.yield()sleep()或等待锁)时,低优先级线程就容易饿死。

  • 避免显式设置过高优先级(如MAX_PRIORITY),除非有强实时需求
  • 不要依赖优先级做业务逻辑的“公平性”保障——它不可靠、不可移植

不公平锁导致等待线程被反复跳过

ReentrantLock默认构造为非公平锁:新线程尝试加锁时,可直接与等待队列中的线程“抢”,而等待队列里的老线程可能连续多次被插队。若竞争激烈、新请求不断涌入,队首线程可能迟迟无法获取锁,形成饥饿。

  • 必要时使用new ReentrantLock(true)启用公平模式(牺牲吞吐换公平)
  • 注意公平锁会显著降低并发性能,仅在确实观察到某线程长期卡在WAITING状态时再考虑

无限等待无超时的同步操作

调用Object.wait()BlockingQueue.take()CountDownLatch.await()等方法时,若没有设置超时,又缺乏可靠的唤醒机制(如漏写notify()、信号丢失、条件判断错误),线程就会永久挂起——表面是“等待”,实则是饥饿的一种表现(永远等不来唤醒)。

A1.art
A1.art

一个创新的AI艺术应用平台,旨在简化和普及艺术创作

下载

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

  • 优先选用带超时的版本(如wait(timeout)poll(timeout)
  • 确保每个wait()都有对应且正确的notify()/notifyAll()路径,尤其注意异常分支是否遗漏唤醒

线程池中任务持续堆积且拒绝策略不当

当线程池核心线程全忙、队列已满、新任务不断提交,又配置了DiscardPolicyCallerRunsPolicy时,部分任务可能被静默丢弃,或由提交线程同步执行(拖慢调用方)。如果业务上某些关键任务总被晚提交、总进队尾、又总被丢弃,也会表现出“饥饿感”——它的逻辑从没被执行。

  • 监控线程池的getQueue().size()getActiveCount(),及时发现积压
  • 根据场景选合适拒绝策略;必要时自定义RejectedExecutionHandler,记录日志或降级处理,而非简单丢弃

基本上就这些。饥饿不是语法错误,而是并发设计中对资源分配、调度语义和唤醒契约的疏忽所致。它难复现、难定位,但往往暴露在线上长周期运行后——多关注线程状态分布、锁竞争热点和任务延迟指标,比单纯看CPU更有效。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

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

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

765

2023.08.10

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

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

99

2025.12.01

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1496

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1170

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

835

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

463

2023.08.02

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

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

精品课程

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

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.7万人学习

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

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