理解Java中的死锁(Deadlock)及其示例

目录

背景:

示例代码:

类定义与变量声明:

run方法:

main方法 :

死锁示例解释:

总结:


背景:

在Java多线程编程中,死锁(Deadlock)是一个必须警惕和避免的问题。当两个或更多的线程在相互等待对方释放资源时,就会陷入死锁状态。这通常发生在多个线程试图同时访问共享资源,并且每个线程都持有一个资源且等待获取另一个线程持有的资源时。死锁会导致程序无法继续执行,甚至可能导致系统崩溃。

示例代码:

类定义与变量声明:

public class TestDeadLock implements Runnable {    public int flag = 1;    static Object o1 = new Object(), o2 = new Object();

 这里定义一个名为TestDeadLock的类,该类实现了Runnable接口,这意味着它可以作为线程的任务执行,类中有两个静态对象o1和o2,它们将作为同步锁来使用。还有一个非静态变量flag,用于控制线程执行那个逻辑块。

run方法:

public void run() {    System.out.println("flag=" + flag);  if (flag == 1) {    synchronized (o1) {    try {    Thread.sleep(500);    } catch (Exception e) {    e.printStackTrace();    }    synchronized (o2) {    System.out.println("1");  }    }    }    if (flag == 0) {    synchronized (o2) {    try {    Thread.sleep(500);    } catch (Exception e) {    e.printStackTrace();    }    synchronized (o1) {    System.out.println("0");  }    }    }    
}

在run方法中,首先打印当前线程的flag值,然后,根据flag的值,线程会尝试获取不同的锁并执行相应的代码

·当flag为1时,线程首选获取o1锁,休眠500毫秒,然后尝试获取o2的锁,如果成功过,则打印"1".

·当flag为2时,线程首选获取o2锁,休眠500毫秒,然后尝试获取o1的锁,如果成功过,则打印"0".

main方法 :

public static void main(String[] args) {    TestDeadLock td1 = new TestDeadLock();    TestDeadLock td2 = new TestDeadLock();    td1.flag = 1;    td2.flag = 0;  Thread t1 = new Thread(td1);    t1.start(); // 启动线程t1  Thread t2 = new Thread(td2);    t2.start(); // 启动线程t2  
}

在min方法中,创建了两个TestDeadLock实例td1和td2,并分别设置它们的flag值为1和0;,然后,基于这两个实例创建两个线程t1和t2,并启动它们

死锁示例解释:

由于td1和flag为1,它首先获取了o1的锁,并休眠500毫秒。在td1休眠期间,td2开始执行并获取了o2的锁。当td1醒来兵尝试获取o2的锁时,它会被阻塞,因为o2的锁已经被td2持有,同样地,当td2醒来兵尝试获取o1的锁时,因为o1的锁已经被td1持有,这样,两个线程都陷入了等待状态,形成了死锁

总结:

为了避免死锁,可以采取以下策略:

策略描述
保持一致的加锁顺序确保所有线程在访问多个共享资源时都以相同的顺序请求锁。这有助于防止循环等待条件,从而减少死锁的风险。
避免嵌套锁尽量减少在同一线程中持有多个锁的时间,并避免在持有锁时请求其他锁。嵌套锁可能增加死锁的风险,因为它增加了线程间相互等待的可能性。
使用锁超时为锁的获取设置超时时间。这允许线程在无法及时获取锁时放弃等待,并继续执行其他任务。这有助于避免无限期地等待锁,从而减少了死锁的风险。
使用并发工具利用Java提供的并发工具,如SemaphoreCountDownLatchCyclicBarrier等。这些工具提供了更高级的同步机制,可以帮助简化并发编程并减少死锁的风险。它们通常提供了更灵活的锁定和等待策略,以及更强大的并发控制功能。
检测和诊断使用JVM提供的诊断工具(如jstack)来检测和分析死锁。当发现死锁时,分析线程堆栈和锁定关系以找到问题的根源。这些工具可以帮助你快速定位死锁的位置,并提供有关线程状态和锁定情况的信息,以便你能够采取适当的措施来解决问题。
代码审查和测试通过代码审查和并发测试来确保代码中没有潜在的死锁风险。在代码审查中,特别关注多线程访问共享资源的部分,确保加锁顺序一致、避免嵌套锁等。在并发测试中,模拟多个线程同时访问共享资源的场景,以验证代码在并发环境下的稳定性和性能,并检查是否存在死锁问题。

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

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

相关文章

在Mandelbrot 集中“缩放”特定区域

1、问题背景 在创建一个快速生成 Mandelbrot 集图像的 Python 程序时,程序开发者遇到一个问题:他想要渲染该集合的一个特定区域,但他不知道如何修改代码中的数学部分来实现 “缩放”。 2、解决方案 第一种解决方案 问题根源是代码中的一行…

SVN学习(007 svn安装Tortoise工具)

尚硅谷SVN高级教程(svn操作详解) 总时长 4:53:00 共72P 此文章包含第58p-第p72的内容 介绍 安装 选择自己想要装软件的文件夹 进入工作目录,发现无svn的图标,重启电脑即可 就能看到svn的图标 settings功能 进行图标的查看 修改subversion配置文件 …

安卓直装植物大战僵尸杂交版V2.1版完美运行

在移动游戏的世界里,植物大战僵尸无疑是一款深受玩家喜爱的经典游戏。如今,随着技术的发展和玩家需求的变化,植物大战僵尸杂交版V2.1版应运而生,为安卓用户带来了全新的游戏体验。 这一全新版本在原有游戏的基础上进行了多项创新…

SAP系统中的应付账款(与MM集成,关账操作)

1. 与物料管理的集成 Plant: 工厂是后勤中的位于中心位置的组织对象,一个“工厂”可以是公司内的一个作业区,或一个分支机构。一个“工厂”可以是一个中央交付仓库,可以是一个区域的销售营业部,一个制造工厂,一个集团…

java 反射介绍

Java 反射机制是一种强大的工具,它允许程序在运行时动态地获取有关类、接口、方法和字段的信息,以及动态调用方法和构造函数、访问字段。反射是 Java 提供的一种功能强大的编程工具,广泛用于框架、工具库和其他需要动态处理类型信息的场景。 反射的常用操作 1. 获取类名:…

合适的智能猫砂盆到底怎么挑?开放式封闭式一次说清!

想当初我也是在网上看了各种测评,纠结了好久才下定决心入手了智能猫砂盆。封闭式和开放式都用过,各有各的利与弊,不过最后的我还是选择了开放式的智能猫砂盆,因为开放式的设计结构会更加方便我观察小猫,哪个铲屎官不喜…

采购OLED透明屏指南

一、引言 OLED透明屏作为一种前沿的显示技术,以其独特的透明度和出色的显示效果,受到了众多行业的青睐。在采购OLED透明屏时,需要综合考虑多个因素,以确保选择到符合需求的高质量产品。以下是一份详细的采购OLED透明屏指南&#x…

《云南化工》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问:《云南化工》是不是核心期刊? 答:不是,是知网收录的第一批认定学术期刊。 问:《云南化工》级别? 答:省级。主办单位:云天化集团有限责任公司 主管单位:…

让我们聊聊网络安全中会涉及到的IP地址(IP协议)、MAC地址、路由、DNS协议(域名系统)、NAT技术(协议)、以太网帧、ARP协议

网络安全中会涉及到的IP地址(IP协议)、MAC地址、路由、DNS协议(域名系统)、NAT技术(协议)、以太网帧、ARP协议 一.IP地址(IP协议)1.IP地址(IP协议)的作用2.IP…

小山菌_代码随想录算法训练营第三十四天| 56. 合并区间、

56. 合并区间 文档讲解&#xff1a;代码随想录.合并区间 视频讲解&#xff1a;贪心算法&#xff0c;合并区间有细节&#xff01;LeetCode&#xff1a;56.合并区间 状态&#xff1a;已完成 代码实现 class Solution { public:vector<vector<int>> merge(vector<…

Go 实现SFTP连接服务

我们将SFTP连接和处理逻辑&#xff0c;以及登录账户信息封装&#xff0c;这样可以在不同的地方重用代码&#xff0c;并且可以轻松地更改登录凭据。下面我将演示如何使用Go语言中的结构体来封装这些信息&#xff0c;并实现一个简单的SFTP服务器&#xff1a; package mainimport…

配置Nginx 在服务器重启后自动启动

记录一下&#xff0c;配置Nginx 在服务器重启后自动启动&#xff0c;可以通过配置 systemd 服务来实现。以下是具体步骤&#xff1a; 检查 Nginx 服务的状态&#xff1a; 先确认 Nginx 是否已经安装并且可以通过 systemctl 管理&#xff1a; sudo systemctl status nginx如果…

大厂薪资福利篇第五弹:小红书

欢迎来到绝命Coding&#xff01; 今天继续更新大家最关心的 大厂薪资福利系列&#xff01; 为什么计算机学子对大厂趋之若鹜呢&#xff1f;最直接的原因就是高薪资的吸引力。 • 但是薪资可不是简单的数字哦&#xff0c;里面还是有很多“学问”的。 • 很多同学对大厂薪资只有一…

《黑神话悟空》电脑配置要求

《黑神话&#xff1a;悟空》这款国内优秀的3A游戏大作&#xff0c;拥有顶级的特效与故事剧情&#xff0c;自公布以来便备受玩家期待&#xff0c;其精美的画面与流畅的战斗体验&#xff0c;对玩家的电脑配置提出一定要求。那么这款优秀的游戏需要什么样的电脑配置&#xff0c;才…

老板舍不得买库存管理软件❓一招解决

在当今快节奏的商业环境中&#xff0c;仓库管理是企业运作中不可或缺的一环。对于许多中小型企业而言&#xff0c;简易且高效的库存管理系统尤为重要。搭贝简易库存管理系统针对仓库的出入库进行有效管理&#xff0c;帮助企业实现库存的透明化和流程的自动化。 客户的痛点 1. …

基于SSM构建的校园失眠与压力管理系统的设计与实现【附源码】

毕业设计(论文) 题目&#xff1a;基于SSM构建的校园失眠与压力管理系统的设计与实现 二级学院&#xff1a; 专业(方向)&#xff1a; 班 级&#xff1a; 学 生&#xff1a; 指导教师&a…

SNEC天合储能秀:全球首发多元场景一站式工商业储能融合解决方案

6月13日-15日&#xff0c;SNEC2024光伏与智慧能源展在上海隆重举行&#xff0c;来自全球95个国家和地区3000家国内外展商齐聚展会&#xff0c;5000行业专家共话产业发展。致力于成为全球光储智慧能源解决方案的领导者&#xff0c;天合光能&#xff08;展位号&#xff1a;7.2H-E…

2024-06-24 问AI: 在大语言模型中,什么是ray?

文心一言 在大语言模型中&#xff0c;Ray是一个开源的统一框架&#xff0c;用于扩展AI和Python应用程序&#xff0c;特别是在机器学习领域。以下是关于Ray的详细解释&#xff1a; 核心功能&#xff1a; Ray为并行处理提供了计算层&#xff0c;使得用户无需成为分布式系统专家…

GitLab 不小心提交了master/develop版本如何回退

1. 找寻最近的版本&#xff0c;使用git reset --hard 回退到具体的提交版本号 2. git push origin master --force 这个会遇到gitlab默认拦截&#xff0c;处理版本 版本仓库页面&#xff0c;选择Setting——Repository&#xff0c;找到Protected branches 3. 再回到master分支…

Linux系统SPI子系统框架驱动调用实现详解

大家好,今天主要和大家分享一下,如何使用Linux系统中SPI子系统框架,也是分为主机驱动和设备驱动,裸机部分控制的是SPI控制器驱动,可以直接操控。 第一:Linux系统SPI主机驱动 SPI主机驱动就是SOC的SPI控制器驱动。Linux内核使用spi_master表示主机SPI驱动spi_master 是个结…