25.死锁

一个线程如果需要同时获取多把锁,就容易产生死锁。

t1线程获得A对象锁,接下来想获取B对象的锁。

t2线程获得B对象锁,接下来想获取A对象的锁。

/*** 死锁demo* @param args*/public static void main(String[] args) {Object a = new Object();Object b = new Object();new Thread(() -> {synchronized (a) {log.info("lock a");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (b) {log.info("lock b...");}}}, "t1").start();new Thread(() -> {synchronized (b) {log.info("lock b");try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (a) {log.info("lock a...");}}}).start();}

使用工具定位死锁:

cmd下的jps命令,可以查看当前正在运行的java进程

工具一:jstack命令 

可以定位到具体的代码行数: 

工具二:jconsole

经典死锁案例:五位哲学家五根筷子吃饭

public class DeadLockDemo {public static void main(String[] args) {Chopstick chopstick1 = new Chopstick("1");Chopstick chopstick2 = new Chopstick("2");Chopstick chopstick3 = new Chopstick("3");Chopstick chopstick4 = new Chopstick("4");Chopstick chopstick5 = new Chopstick("5");new Philosopher("哲学家1", chopstick1, chopstick2).start();new Philosopher("哲学家2", chopstick2, chopstick3).start();new Philosopher("哲学家3", chopstick3, chopstick4).start();new Philosopher("哲学家4", chopstick4, chopstick5).start();new Philosopher("哲学家5", chopstick5, chopstick1).start();}
}@Slf4j
class Philosopher extends Thread {//左边的筷子Chopstick left;//右边的筷子Chopstick right;public Philosopher(String name, Chopstick left, Chopstick right) {super(name);//设置线程名称this.left = left;this.right = right;}@Overridepublic void run() {while (true) {//这里意思是一位哲学家获取了两根筷子后吃完饭,又重新开始下一轮...synchronized (left) {synchronized (right) {eat();}}}}private void eat() {log.info("eat...");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}
}/*** 筷子类*/
class Chopstick {//名称private String name;public Chopstick(String name) {this.name = name;}@Overridepublic String toString() {return "Chopstick{" +"name='" + name + '\'' +'}';}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用【知乎引流软件工具】进行有效引流

知乎,这个内容平台,无疑是品牌和创作者们的乐园。 品牌能在这里找到目标关键词,而创作者们的内容则可以吸引流量,助力各种项目。 别被那些所谓的爆粉秘籍迷惑了,真正的成功往往来自于扎实的内容和策略,而非…

云原生(七)、Kubernetes初学 + 裸机搭建k8s集群

Kubernetes简介 Kubernetes(通常简称为K8s)是一个开源的容器编排平台,最初由Google设计和开发,现在由Cloud Native Computing Foundation(CNCF)维护。它旨在简化容器化应用程序的部署、扩展和管理。 Kube…

IPC 进程间通信

IPC InterProcess Communication The concept of IPC Each process has a differnt user addess space,and local variables 各自看不见,so 进程间通信 need kernel(内核), so a buffer is opened in the kernel,process 1 copies data from user space to this buffer,and …

Linux:运营商在网络中扮演的角色

文章目录 ip目前的问题ip目前的几种解决方案私有ipVS公有ip运营商再谈ip划分运营商的角度看ip 本篇总结的是运营商在网络中扮演的角色 ip目前的问题 在目前看来,ip最大的问题是ip号不够用了,那这个问题如何解决呢? 在之前的内容中有子网掩…

朗之万方程,机器学习与液体中的粒子运动

目录 一、说明二、朗之万方程的诞生2.1 牛顿力学2.2 流体中的随机运动 三、小质量物体布朗运动方程四、布朗运动的Python代码五、稳定性讨论5.1 波尔兹曼分布5.2 梯度下降算法 六、随机梯度下降(SGD)和小批量梯度下降七、机器学习与物理,作为…

加密软件VMProtect教程:使用脚本-功能

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic(本机)、Virtual Pascal和XCode编译器。 同时,VMProtect有一个内置的反汇编程序,可以与Windows和Mac OS X可执行文件一起…

最大连续1的个数||

又用到滑动窗口&#xff0c;关键在于要维持窗口内0的数量在k内 #include<stdio.h> #include<string.h>int Max(int a,int b){return (a>b)?a:b; }int findMaxConsecutiveOnes(int* nums,int numsSize,int k){int left 0;int right 0;int flag 0;//记录包含…

系统设计理念:满足设计要求

在今天的文章中,我们将层层剥离并深入探讨系统设计要求的本质。 让我们了解系统设计的支柱以及如何创建强大且有弹性的应用程序。 什么是好的设计? 在我们深入讨论技术细节之前,让我们先讨论一下什么是好的设计。 当我们谈论系统架构中的良好设计时,我们关注几个关键原则:…

初始C语言最后一章《编译、链接与预处理详解》

前言 感谢老铁们的陪伴和支持&#xff0c;初始C语言专栏在本章内容也是要结束了&#xff0c;这创作一路下来也是很不容易&#xff0c;如果大家对 Java 后端开发感兴趣&#xff0c;欢迎各位老铁来我的Java专栏&#xff01;当然了&#xff0c;我也会更新几章C语言实现简单的数据结…

C++中的面向对象到底是什么

C中的面向对象到底是什么 对象嘛&#xff0c;就和大家都有的对象一样&#xff0c;两只眼睛、一个嘴巴、两条腿…… 对不起跑题了&#xff0c;C的面向对象中的对象可不是显示中的对象哦&#xff0c;但是有一些相似之处&#xff0c;有对象的同学可以参考着去学习C面向对象的概念…

HackTheBox-Machines--Builder

文章目录 1 端口扫描2 测试思路3 漏洞测试 Builder测试过程 1 端口扫描 nmap -sC -sV 10.129.230.2202 测试思路 系统开启了22和8080端口&#xff0c;22端口无账号密码&#xff0c;测试方向主要从8080的jenkins服务开始测试。 在测试开源系统时&#xff0c;可以下载源代码或本地…

3、jvm基础知识(三)

如何判断堆上的对象没有被引用&#xff1f; 常见的有两种判断方法&#xff1a;引用计数法和可达性分析法。 引用计数法会为每个对象维护一个引用计数器&#xff0c;当对象被引用时加1&#xff0c;取消引用时减1。 引用计数法的优点是实现简单&#xff0c;缺点有两点&#xff1…

电机选型与直线模组(简化版)

2-1电机分类和普通电机选型 1、电机及其原理的基本认知&#xff1a; 电动机我们平时简称电机&#xff0c;大部分情况下指的都是通电后&#xff0c;输出轴会旋转运动的设备。即将电能转换为机械能&#xff0c;供我们使用以驱动机构运行。电机简单的讲&#xff0c;其实就是一个…

梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码

源码简介 最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载 梨花带雨播放器基于thinkphp6开发的XPlayerHTML5网页播放器前台控制面板,支持多音乐平台音乐解析。二开内容&#xff1a;修复播放器接口问题&#xff0c;把接口本地化&#xff0c;但是集成外链播放器…

【Qt】常用控件(输入类)

目录 一、Line Edit二、Text Edit三、ComBo四、DateTimeEdit五、Slider 一、Line Edit QLineEdit 用来表示单行输入框&#xff0c;可以输入一段文本&#xff0c;但是不能换行。 属性说明test输入框中的文本inputMask输入内容格式约束maxLength最大长度frame是否添加边框echoM…

harbor api v2.0

harbor api v2.0 v2.0 v2.0 “harbor api v2.0”与v1区别较大&#xff0c;此处harbor也做了https。另外&#xff0c;通过接口拿到的数据也是只能默认1页10个&#xff0c;所以脚本根据实际情况一页页的循环抓取数据 脚本主要用于统计repo(仓库)、image&#xff0c;以及所有镜像…

【新手适用】手把手教你从零开始实现一个基于Pytorch的卷积神经网络CNN二: 如何训练模型,内附详细损失、准确率、均值计算

手把手教你从零开始实现一个基于Pytorch的卷积神经网络CNN&#xff08;新手适用&#xff09;一&#xff1a; model.py&#xff1a;创建模块-CSDN博客 从零开始实现一个基于Pytorch的卷积神经网络 - 知乎 目录 1 设备device定义 2 训练模型定义 3 开始训练 3.1 step、batch…

4.机器学习-十大算法之一线性回归算法(LinearRegression)案例讲解

机器学习-十大算法之一线性回归算法案例讲解 一摘要二个人简介三什么是线性回归四LinearRegression使用方法五糖尿病数据线性回归预测1.数据说明2.导包3.导入数据4.脱敏处理5.抽取训练数据和预测数据6.创建模型7.预测8.线性回归评估指标9.研究每个特征和标记结果之间的关系.来分…

职场成功的关键:提升软实力,成就非凡事业

在竞争激烈的职场中&#xff0c;专业技能固然重要&#xff0c;但软实力同样不可或缺。要想在职场中脱颖而出&#xff0c;实现事业上的成功&#xff0c;我们需要在提升软实力上下功夫。本文将探讨职场软实力的内涵及其在职场成功中的作用&#xff0c;并提供一些建议&#xff0c;…

解决Quartus与modelsim联合仿真问题:# Error loading design解决,是tb文件中没加:`timescale 1ns/1ns

解决Quartus与modelsim联合仿真问题&#xff1a;# Error loading design解决&#xff0c;是tb文件中没加&#xff1a;timescale 1&#xff0c;一直走下来&#xff0c;在modelsim中出现了下面问题2&#xff0c;rtl文件、tb文件2.1&#xff0c;rtl代码2.2&#xff0c;tb测试2.3&a…