双非本科准备秋招(20.2)—— 线程活跃性:死锁、活锁、饥饿

一、死锁

        一个线程需要获得多把锁,就容易出现死锁。

        比如此时有两把锁,分别是A和B。线程1首先需要获得A,然后获得B;线程2首先需要获得B,然后获得A。于是两个线程就一直等待对方释放锁。

二、死锁之哲学家就餐

一个圆桌,五个人,五只筷子,每个人吃饭需要拿起左右两边的筷子吃,设计代码:

设计筷子类

class Chopstick{String name;public Chopstick(String name) {this.name = name;}@Overridepublic String toString() {return "筷子{" +"name='" + name + '\'' +'}';}
}

设计哲学家类

@Slf4j(topic = "c.phi")
class philosopher extends Thread{Chopstick left;Chopstick right;public philosopher(String name, Chopstick left, Chopstick right) {super(name);this.left = left;this.right = right;}private void eat(){log.debug("吃饭吃饭");try {Thread.sleep(400);} catch (InterruptedException e) {e.printStackTrace();}}@Overridepublic void run(){while (true){synchronized (left){synchronized (right){eat();}}}}
}

main中测试代码如下:

public class testPhilosopher {public static void main(String[] args) {Chopstick c1 = new Chopstick("1");Chopstick c2 = new Chopstick("2");Chopstick c3 = new Chopstick("3");Chopstick c4 = new Chopstick("4");Chopstick c5 = new Chopstick("5");new philosopher("柏拉图", c1, c2).start();new philosopher("康德", c2, c3).start();new philosopher("尼采", c3, c4).start();new philosopher("庄子", c4, c5).start();new philosopher("马克思", c5, c1).start();}
}

可以看到,执行不下去了:

死锁定位

我们先用jps命令定位进程id,可以看到id为6620

再使用jstack 6620查看:这样就能看到死锁的准确定位了

Found one Java-level deadlock:
=============================
"马克思":waiting to lock monitor 0x0000000020521d58 (object 0x000000076bf84248, a com.smy.day4.Chopstick),which is held by "柏拉图"
"柏拉图":waiting to lock monitor 0x000000001cdd2868 (object 0x000000076bf84288, a com.smy.day4.Chopstick),which is held by "康德"
"康德":waiting to lock monitor 0x000000001cdd27b8 (object 0x000000076bf842c8, a com.smy.day4.Chopstick),which is held by "尼采"
"尼采":waiting to lock monitor 0x000000001cdcff28 (object 0x000000076bf84308, a com.smy.day4.Chopstick),which is held by "庄子"
"庄子":waiting to lock monitor 0x000000001cdcffd8 (object 0x000000076bf84348, a com.smy.day4.Chopstick),which is held by "马克思"at com.smy.day4.philosopher.run(testPhilosopher.java:62)- waiting to lock <0x000000076bf84288> (a com.smy.day4.Chopstick)- locked <0x000000076bf84248> (a com.smy.day4.Chopstick)
"康德":at com.smy.day4.philosopher.run(testPhilosopher.java:62)- waiting to lock <0x000000076bf842c8> (a com.smy.day4.Chopstick)- locked <0x000000076bf84288> (a com.smy.day4.Chopstick)
"尼采":at com.smy.day4.philosopher.run(testPhilosopher.java:62)- waiting to lock <0x000000076bf84308> (a com.smy.day4.Chopstick)- locked <0x000000076bf842c8> (a com.smy.day4.Chopstick)
"庄子":at com.smy.day4.philosopher.run(testPhilosopher.java:62)- waiting to lock <0x000000076bf84348> (a com.smy.day4.Chopstick)- locked <0x000000076bf84308> (a com.smy.day4.Chopstick)Found 1 deadlock.

三、活锁

活锁出现在两个线程互相改变对方的结束条件,最后谁也无法结束。

比如:cnt=5

线程1一直循环,退出条件是cnt <10,每次-1sleep1秒

线程2一直循环,退出条件是cnt >0,每次+1sleep1秒

这样cnt一直保持加一减一,谁也满足不了条件,就形成了活锁。

四、饥饿

一个线程始终得不到 CPU 调度执行,也不能够结束。

比如哲学家问题,我们可以用顺序加锁的方式解决死锁。

因为他们要持有的筷子是

1 2

2 3

3 4

4 5

5 1

这样,有可能每个人都持有1,2,3,4,5导致死锁,那我们把最后一个改成1 5,这样就破坏了死锁的条件,1这把筷子会被竞争。

但是,当我们这样修改之后,马克思一直吃不上饭,进入了饥饿状态。

这是吃饭时间为300ms的情况:

吃饭时间为10ms时:可以发现,这时候某个线程总能抢到筷子,但是有的线程永远拿不到,饥饿的线程越来越饥饿。庄子需要4 5筷子,马克思需要1 5,但是马克思抢不到饭,因为他执行的晚,一直抢不到1筷子,所以庄子需要的5筷子就没人用,所以庄子总是能顺利进行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2775435.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle 面试题 | 20.精选Oracle高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

JavaScript实现轮播图方法

效果图 先来看下效果图&#xff0c;嫌麻烦就不用具体图片来实现了&#xff0c;主要是理清思路。&#xff08;自动轮播&#xff0c;左右按钮切换图片&#xff0c;小圆点切换图片&#xff0c;鼠标移入暂停轮播&#xff0c;鼠标移出继续轮播&#xff09; HTML 首先是html内容&am…

Open CASCADE学习|求圆的切线与切点

在几何学中&#xff0c;一个圆的切线被定义为与圆相切于一点的直线&#xff0c;而该点被称为切点。这意味着切线在切点处与圆仅有一个交点&#xff0c;并且在该点处&#xff0c;切线的方向与圆的半径垂直。 以下是关于圆的切线和切点的一些重要性质&#xff1a; 切线与半径的…

【开源】SpringBoot框架开发医院门诊预约挂号系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2 科室医生档案模块2.1.3 预约挂号模块2.1.4 医院时政模块 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 维护性 三、数据库设计3.1 用户表3.2 科室档案表3.3 医生档案表3.4 医生放号…

讯飞星火认知大模型V3.5 python调用 Web API

具体参考 科大讯飞:星火认知大模型Web API文档 目录 1.首先要注册一个 讯飞星火账号&#xff0c;2. 按照自己的业务需求&#xff0c;翻看相关SDK开发文档&#xff0c; 如图1所示。3. 星火认知大模型Web API python示例源码文件共两个*接口请求与接口解析函数&#xff1a;Spark…

TCP和UDP相关问题(重点)——8.TCP的拥塞控制怎么实现的?

在某段时间内&#xff0c;若对网络中某一资源的需求超过了该资源所能提供的可用部分&#xff0c;网络性能就会变坏&#xff0c;比如在高速公路上行驶的车辆&#xff0c;如果一时期内涌入了太多的车辆&#xff0c;道路将变得拥堵&#xff0c;交通状况变差。网络中也是一样&#…

Quartus工程的qsf配置约束文件介绍

一、qsf文件概述 qsf&#xff1a;Quartus Setting File&#xff0c;是Quartus工程的配置文件&#xff1b; 包含一个Quartus工程的所有约束&#xff0c;包括工程的软件版本信息、FPGA器件信息、引脚约分配、引脚电平分配&#xff0c;编译约束和用于Classic TimingAnalyzer的时…

MATLAB环境下基于深层小波时间散射网络的ECG信号分类

2012年&#xff0c;法国工程学院院士Mallat教授深受深度学习结构框架思想的启发&#xff0c;提出了基于小波变换的小波时间散射网络&#xff0c;并以此构造了小波时间散射网络。 小波时间散射网络的结构类似于深度卷积神经网络&#xff0c;不同的是其滤波器是预先确定好的小波…

DMA直接内存访问,STM32实现高速数据传输使用配置

1、DMA运用场景 随着智能化、信息化的不断推进&#xff0c;嵌入式设备的数据处理量也呈现指数级增加&#xff0c;因此对于巨大的数据量处理的情况时&#xff0c;必须采取其它的方式去替CPU减负&#xff0c;以保证嵌入式设备性能。例如SD卡存储器和音视频、网络高速通信等其它情…

Vue中 常用的修饰符有哪些

Vue是一款建立在JavaScript框架上的开源前端库&#xff0c;已经成为当今前端开发人员最喜爱的选择之一。它的简洁语法和强大的功能使得开发者可以轻松地构建交互性的网页应用程序。在Vue中&#xff0c;修饰符是一个重要的概念&#xff0c;它们可以帮助我们更好地控制和定制DOM元…

【数据结构】二叉树的顺序结构及链式结构

目录 1.树的概念及结构 1.1树的概念 1.2树的相关概念 ​编辑 1.3树的表示 1.4树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1二叉树的概念 2.2现实中的二叉树 ​编辑 2.3特殊的二叉树 2.4二叉树的性质 2.5二叉树的存储结…

c++新特性override和final

override 作用: 在子类中重写父类的虚函数&#xff0c;我们可以在子类的虚函数声明后加上override。 上图就在重写eat()的时候&#xff0c;加上override。 作用: 1. 可以提示读者&#xff0c;这个函数是重写自父类中的。 2. 加上override之后&#xff0c;我们在重…

数据库管理-第148期 最强Oracle监控EMCC深入使用-05(20240208)

数据库管理148期 2024-02-08 数据库管理-第148期 最强Oracle监控EMCC深入使用-05&#xff08;20240208&#xff09;1 性能主页2 ADDM Spotlight3 实时ADDM4 数据库的其他5 主机总结 数据库管理-第148期 最强Oracle监控EMCC深入使用-05&#xff08;20240208&#xff09; 作者&am…

实例分割论文阅读之:FCN:《Fully Convolutional Networks for Semantica Segmentation》

论文地址:https://openaccess.thecvf.com/content_cvpr_2015/papers/Long_Fully_Convolutional_Networks_2015_CVPR_paper.pdf 代码链接&#xff1a;https://github.com/pytorch/vision 摘要 卷积网络是强大的视觉模型&#xff0c;可以产生特征层次结构。我们证明&#xff0c…

Python解决SSL不可用问题

参考&#xff1a;https://blog.csdn.net/weixin_44894162/article/details/126342591 一、问题描述&#xff1a; 报错概述&#xff1a; WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. ## 警告:pip配…

Project 2019下载安装教程,保姆级教程,附安装包和工具

前言 Project是一款项目管理软件&#xff0c;不仅可以快速、准确地创建项目计划&#xff0c;而且可以帮助项目经理实现项目进度、成本的控制、分析和预测&#xff0c;使项目工期大大缩短&#xff0c;资源得到有效利用&#xff0c;提高经济效益。软件设计目的在于协助专案经理发…

ubuntu原始套接字多线程负载均衡

原始套接字多线程负载均衡是一种在网络编程中常见的技术&#xff0c;特别是在高性能网络应用或网络安全工具中。这种技术允许应用程序在多个线程之间有效地分配和处理网络流量&#xff0c;提高系统的并发性能。以下是关于原始套接字多线程负载均衡技术的一些介绍&#xff1a; …

交通 | 共乘出行(下):基于图结构的动态多时空供需网络的均衡度量方法

博客&#xff1a;Alex Chin, & Tony Qin. (2023.02.25). Quantifying Efficiency in Ridesharing Marketplaces. Link: https://eng.lyft.com/quantifying-efficiency-in-ridesharing-marketplaces-affd53043db2 论文&#xff1a;Chin, Alex, and Zhiwei Qin. “A Unified…

Springboot根据环境读取application配置文件

目录 1. 首先创建两个不同配置文件 2. pom.xml 配置文件 3. 指定环境 4. 最后启动测试 1. 首先创建两个不同配置文件 分别为开发环境和生产环境 application-dev.properties 和 application-prod.properties application-dev.properties 配置为 1931 端口 application-pro…

CAN通讯协议详解

阅读引言&#xff1a; 本篇博文想给需要的人介绍一下CAN总线&#xff0c; 这个也算是我从B站学习记得笔记分享吧也算是。简单的介绍了CAN总线的大致内容&#xff0c; 简述支持CAN功能的STM32的简单使用例程。本视频的中的图片内容均来自B站爱上半导体博主的内容。 CAN高质量教学…