线程饥饿死锁

死锁篇:线程饥饿死锁问题 文章目录引言线程饥饿死锁资源死锁Timer 定时器死锁分析 引言 线程饥饿死锁 《Java并发编程实践》中对线程饥饿死锁的解释是这样的:在使用线程池执行任务时,如果任务依赖于其他任务,那么就可能产生死锁问题。在单线程的Executor中,若果一个任务将另一个任务提交到同一个Executor,并且等待这个被提交的任务的结果,那么这必定会导致死锁。第一个任务在工作队列中,并等待第二个任务的结果;而第二... 阅读详情
/**
 * 线程饥饿死锁——在单线程Executor中发生死锁
 */
public class ThreaDeadLock {
        //单线程Executor
	ExecutorService exec = Executors.newSingleThreadExecutor();
	
	class RenderPageTask implements Callable<String>{

		@Override
		public String call() throws Exception {
			Future<String> header,footer;
			header = exec.submit(new Callable<String>(){
				@Override
				public String call() throws Exception {
					System.out.println("---渲染头部---");
					Thread.sleep(200);
					return "页头";
				}
				
			});
			footer = exec.submit(new Callable<String>(){

				@Override
				public String call() throws Exception {
					System.out.println("---渲染页脚---");
					Thread.sleep(200);
					return null;
				}
				
			});
			String page = renderBody();
			return header.get()+page+footer.get();
		}

		private String renderBody() throws InterruptedException {
			System.out.println("---渲染Body---");
			Thread.sleep(200);
			return null;
		}
		
	}
	
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		ThreaDeadLock d = new ThreaDeadLock();
		Future<String> result = d.exec.submit(d.new RenderPageTask());
		System.out.println("---结果:---"+result.get());
	}
}

运行结果:可以看到当提交了依赖性任务“渲染页头”以及“渲染页尾”后发生了死锁

原因:在RenderPageTask中有两个子任务footer和header,当在main函数中提交RenderPageTask任务到线程池时,实际上提交了3个任务,但由于线程池是单线程的Executor,每次只会执行一个任务,而RenderPageTask会阻塞等待两个子任务的结果返回,但两个子任务得不到线程来运行,就会阻塞,所以就会产生死锁。

小结:在上面代码中由于使用单线程的Executor,所以会经常发生死锁。同样,如果线程池不够大,那么当多个任务通过栅栏机制来彼此协调时,将导致线程饥饿死锁。(摘自Java并发编程实战第8章)

FFmpeg视频编码的流程详解及参考demo 本文主要讲解FFmpeg的视频编码的具体流程,API使用。最后再以一个非常简单的demo演示将一个yuv数据文件编码为H264的视频文件,也就是YUV编码为H264。 阅读详情

相关推荐

从0到1搭建StarRocks3.4.1存算一体架构(VM 虚拟机版)

本文详细介绍了如何在VM虚拟机上从零搭建StarRocks 3.4.1存算一体架构。首先阐述了StarRocks作为高性能分布式SQL数据仓库的优势,重点讲解了其存算一体架构的设计原理。随后提供完整的安装指南,包括环境准备(3台CentOS 8虚拟机配置)、网络互通验证、Java环境配置、软件包解压安装等关键步骤。文章特别详细说明了FE和BE节点的配置文件修改(fe.conf和be.conf)以及必要的防火墙端口开放配置。通过图文并茂的方式,帮助开发者和运维人员快速掌握StarRocks集群部署方法,为后续

小 tom的博客 1329

线程的死锁、活锁和饥饿现象

线程的活锁、死锁和饥饿现象

m0_62609939的博客 3038

[终于解决]Ubuntu14.04 32位安装移动网卡(0bda:b711)驱动8188gu tplink-WN726n

大致梳理一下问题解决的流程 首先,在台式机做了双系统,台式机只有一个网线接口,由于项目要求,需要占用网口传输数据,所以用之前买的tplink-WN726n免驱版2.0的移动网卡 【note】免驱版只能在Windows下安装使用,在Ubuntu系统中无法使用,所以,需要另辟蹊径。 找了很多资料,尝试很多方法,有的复杂有的简单,终于解决。 【思路】首先在Ubuntu系统中输入lsusb,查看是否检测到USB网卡设备。然后从Github中复制代码,构建,安装,然后modprobe一下,到前面那步还不行,就再来一步

瑞o 1万+

Java并发编程实战笔记 (三)活跃性问题——死锁、饥饿、活锁

两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。死锁的几种类型:1.锁顺序死锁原因:两个线程试图以不同的顺序来获得相同的锁;如果所有线程以固定的顺序来获得锁,那么在程序中就不会出现锁顺序死锁2. 协作的对象间相互调用发生的死锁3. 资源型死锁。

qq_31887989的博客 602

【gridsample】地平线征程6芯片中gridsample算子的优化与部署实践

本文详细介绍了地平线征程6芯片中gridsample算子的优化与部署实践,重点探讨了PTQ和QAT量化方案在BEV感知任务中的应用。通过双线性插值优化、内存布局调整和混合精度配置等关键技术,显著提升了算子在自动驾驶场景下的性能和精度,为开发者提供了实用的部署指南和调优建议。

zero1的博客 1019

电力现货交易市场-报价方式

电是一种能源,也是一种商品,既然是商品自然可以在市场中进行自由交易。

qq_38225433的博客 5118

线程死锁、锁死、饥饿、活锁讲解

死锁的产生原因以及规避方法等。

aaaPostcard的博客 2093

【WRF-Urban】Registry.EM_COMMON文件概述及urban有关变量

Registry.EM_COMMON文件概述及urban有关变量

WW、forever的博客 1593

线程活跃性问题(死锁、活锁、饥饿)

活锁表示执行任务的线程没有被阻塞,但由于某些条件没有被满足导致重复的去尝试执行任务(失败->尝试->失败),“活锁”与“死锁”的区别在于“死锁”线程一直处于等待状态而“活锁”执行线程在不断的执行;“饥饿”是指线程执行时无法获取到它所需要的资源比如(CPU),一种情况是“线程”优先级分配不合理导致部分线程一直无法被CPU调度执行;另一种情况是某线程持有某个操作的“锁”但其又处于无限循环而又不释放锁,此时其它等待获取此锁的线程获取不到就出现了饥饿问题;饥饿问题会导致服务器响应变差;详见本章序号1、7、8;

weixin_45876411的博客 1470

C#与倍福TwinCAT3通信实战:ADS协议封装与设备变量读写完整源码

倍福(Beckhoff)TwinCAT3 作为工业自动化领域主流的软PLC系统,其内置的ADS(Automation Device Specification)协议是实现上位机与TwinCAT3通信的核心标准。传统ADS通信开发存在门槛高(协议细节复杂)、稳定性差(缺乏统一异常处理)、复用性低(重复编码)等问题。本文基于 C# 技术栈,聚焦“协议封装标准化、变量读写易用化、通信稳定工业化”核心需求,提供一套完整的 ADS 协议封装方案与设备变量读写源码。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1987

(论文加源码)基于CNN和LSTM的脑电情绪识别(数据集为DEAP和seed)

论文及源码见个人主页:https://download.youkuaiyun.com/download/qq_45874683/84118637?spm=1001.2014.3001.5503 (论文加源码)基于CNN和LSTM的脑电情绪识别(数据集为DEAP和seed)4D-CRNN 目录 目录: 运行过程: 1. 运行1D文件(没有什么bug): 2. 再运行3D文件(没有出现bug): 3. 最后运行main文件(出现了两个bug)(前提需要配置好tensorflow的框架): 第一个bug是..

qq_45874683的博客 6363

多线程饥饿现象,饥饿与死锁区别

定义 让有限多的工作线程来轮流异步处理无限多的工作任务,也可以将其归类为分工模式,典型实现就是线程池,也体现经典设计模式中的享元模式。 例如:饭店给每个客人来了,都配备一个新的服务员那么开销资源消耗太大。 注意:不同的类型应该使用不同的线程池,这样能避免饥饿,提升效率。 例如:饭店切菜就是切菜的员工,服务员就是服务员。 饥饿现象 ...

qq_42411214的博客 1万+

2024年软考信息安全工程师备考历年真题汇总

信息安全工程师分属“信息系统”专业,位处中级资格,2016年下半年,第一次开考信息安全工程师(中级)考试。目前每年考试一次。已开考六次,2016年11月12日,2017年5月20日,2018年5月26日,2019年5月25日,2020年11月7日,2021年11月6日为第六次考试。 第五次和第六次考试,采用第二版教材。 2024年软考信息安全工程师备考历年真题汇总

月梦工作室 5101

java线程饥饿死锁,举例剖析线程死锁与饥饿的区别

我觉得可以这么理解死锁和饥饿的区别,首先死锁是同步的,饥饿时异步的。也就是说,死锁可以认为是两个线程或进程同时在请求对方占有的资源,饥饿可以认为是一个线程或是进程在无限的等待另外两个或多个线程或进程占有的但是不会往外释放的资源。介绍“死锁”的例子1:如果线程A锁住了记录R1并等待记录R2,而线程B锁住了记录R2并等待记录R1,这样两个线程A和B就发生了死锁现象。介绍“死锁”的例子2:两个山羊过一个...

weixin_39690958的博客 243

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java线程饥饿死锁_java并发-线程饥饿死锁测试

线程饥饿死锁《Java并发编程实践》中对线程饥饿死锁的解释是这样的:在使用线程池执行任务时,如果任务依赖于其他任务,那么就可能产生死锁问题。在单线程的Executor中,若果一个任务将另一个任务提交到同一个Executor,并且等待这个被提交的任务的结果,那么这必定会导致死锁。第一个任务在工作队列中,并等待第二个任务的结果;而第二个任务则处于等待队列中,等待第一个任务执行完成后被执行。这就是典型的...

weixin_30296363的博客 261

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

如何实现死锁(1)线程饥饿死锁

线程饥饿死锁 1,父线程等待子线程返回值 public class DeadLockDemo { private static ExecutorService exec = Executors.newSingleThreadExecutor(); public static class DeadLockTask implements Callable<String> { @Override public String call() throw

dxw1009636268的博客 323

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

多线程(71)线程饥饿死锁

线程饥饿死锁(Thread Starvation Deadlock)是一种特定类型的死锁,发生在多线程程序中,当一个或多个线程无法获得必要的资源来继续执行,因此永远处于等待状态时。

qq_43012298的博客 764

线程释放_线程饥饿死锁及代码复现

背景1. 当前系统大体实现系统主要服务是提供一个thrift接口供外界调用,thrift接口执行的业务逻辑通过线程池实现并行化。2. 问题描述在问题出现的时刻系统提供的thrift接口不响应外部请求。查看监控发现如下问题:thrift接口提供的服务全部停滞main函数其他线程(和thrift接口不是使用同一个线程池的线程)正常执行thrift接口使用的线程池队列长度较长且不再变化事故原因以往提到的...

weixin_29890403的博客 194

多线程系列之死锁、活锁、饥饿

多线程系列之死锁、活锁、饥饿

qq_38377525的博客 575

5 分钟内判断是不是线程池饥饿死锁(Thread Starvation Deadlock),以及怎么把证据抓全。

摘要: 线程池饥饿死锁(Thread Starvation Deadlock)表现为大量请求线程(如Tomcat/NIO)卡在CompletableFuture.join/get等等待操作,同时执行异步任务的线程池资源不足或被阻塞。关键特征是同线程池的嵌套等待(外层任务等待内层任务)。通过连续三次jstack抓取堆栈,可观察线程是否持续卡在同一位置。诊断要点包括:1)Tomcat线程卡在join/get;2)线程池线程自身也在等待;3)commonPool并行度不足。与经典死锁不同,它不会显示"d

IT枫斗者的博客 1773

java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?

死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了。 死锁 死锁是多线程中最差的一种情况,多个线程相互占用对方的资源的锁,而又相互等对方释放锁,此时若无外力干预,这些线程则一直处理阻塞的假死状态,形成死锁。 举个例子,A同学抢了B同学的钢笔,B同学抢了A同学的书,两个人都相互占用对方的东西,都在让对方先还给自己自己再还,这样一直争执下去等待对方还而又得不到解决,老师知道此事后就让他们相互还给对方,这样在外力的干预下他们才解决,当.

Java技术栈,分享最主流的Java技术 1070

java线程饥饿死锁,我可以使用ForkJoinPool的工作窃取行为来避免线程饥饿死锁吗?...

A thread starvation deadlock occurs in a normal thread pool if all the threads in the pool are waiting for queued tasks in the same pool to complete. ForkJoinPool avoids this problem by stealing work...

weixin_39724362的博客 482
上一篇: volatile和final
下一篇: Iterator源码解析及和for-each循环
ack_Finding
博客等级 码龄10年 6粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值