锁的合理使用能够保证共享数据的安全性,但是 使用不当也会可能引起死锁。


1. 死锁概念

死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。


2. 死锁原因

  1. 互斥条件(Mutual Exclusion)
    资源一次只能被一个线程独占使用。
  2. 持有并等待(Hold and Wait)
    线程在持有至少一个资源的同时,还在等待其他线程持有的资源。
  3. 不可抢占(No Preemption)
    资源不能被强制释放,只能由持有它的线程主动释放。
  4. 循环等待(Circular Wait)
    存在一个线程等待链,每个线程都在等待下一个线程持有的资源。

当这四个条件同时满足时,死锁必然发生。

3. 死锁演示

下面的一段代码演示了死锁:

public static void main(String[] args) {Object lockA = new Object();Object lockB = new Object();new Thread(() -> {synchronized (lockA) {System.out.println(Thread.currentThread().getName() + ", 获取了🔒A");try {sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (lockB) {System.out.println(Thread.currentThread().getName() + ", 获取了🔒B");}}}, "线程1").start();new Thread(() -> {synchronized (lockB) {System.out.println(Thread.currentThread().getName() + ", 获取了🔒B");try {sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (lockA) {System.out.println(Thread.currentThread().getName() + ", 获取了🔒A");}}}, "线程2").start();
}

执行结果:


4. 死锁检测

4.1 命令

jps -l

jstack pid

jstack 6612



4.2 图形工具 jconsole


5. 避免死锁

  • 避免一个线程同时获取多个不同的锁
  • 避免一个线程在锁内同时占用多个资源 尽量保证每个锁只占一个资源
  • 尝试使用带超时时间到锁 ,例如 lock.tryLock(timeout) 来替代内部锁机制
  • 对于数据库锁 加锁和解锁必须在同一个数据库连接里,否则会出现解锁失败的情况
  1. 按固定顺序获取锁。
  2. 使用超时机制(tryLock)。
  3. 减少锁的持有时间和粒度。
  4. 利用高级并发工具替代显式锁。

通过合理设计代码结构、遵循锁顺序约定,以及利用Java并发工具包,可有效避免死锁问题。

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

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

相关文章

基于STM32F103C8T6的智能家居健康环境监测系统

项目开发背景 随着城市化进程加速和居民生活水平提升,人们对家居环境健康与安全的需求日益增强。现代住宅常因装修材料、密闭空间及外部污染导致甲醛超标、PM2.5浓度升高、温湿度失衡等问题,长期暴露此类环境中易引发呼吸道疾病、过敏反应等健康隐患。传…

2025职场进阶:B端产品经理必备的计算机专业技能精要

当前企业级服务市场竞争日益激烈,2025年的B端产品经理不仅需要深厚的行业认知,还必须具备扎实的计算机专业技能,才能设计出真正符合技术趋势与业务需求的企业级产品。而其中,人工智能技术已经成为B端产品不可或缺的组成部分&#…

有效三角形的个数(数组单调性)

目录 一:题目链接 二:题目思路 三:代码实现 一:题目链接 题目的要求是找出当前数组能组成三角形三元组的个数。 二:题目思路 有一种暴力枚举解法,利用三层 for 循环来一一枚举三元组的情况,如…

Rust在医疗系统中的应用:安全、性能与合规性实践(上)

Rust在医疗系统中的应用:安全、性能与合规性实践 摘要 医疗系统对软件安全与性能存在严苛双重需求,既需抵御内存漏洞、数据加密风险等安全威胁(如历史医疗设备因软件问题召回案例所示),又需满足电子健康记录(EHR)系统、医学影像处理等高并发数据场景的性能要求,同时需…

读写锁 shared_mutex 共享互斥量介绍

文章目录读数据对数据没有影响,为什么还需要shared_mutex1. 保证读取数据的“一致性”和“时效性”2. 协调“读”与“写”的竞争关系总结好的,我们来详细介绍 C17 中的 std::shared_mutex(共享互斥量,俗称读写锁)的使用…

Nestjs框架: 基于装饰器与Guards的完成RBAC权限系统设计与实现

概述 在现代权限管理系统中,RBAC(基于角色的访问控制)是广泛采用的一种模型RBAC 核心思想是通过角色来管理用户权限通过角色绑定用户、资源和权限,实现细粒度的访问控制为了实现这一目标,我们需要在数据库中设计合理的…

机器学习如何精准预测高值

一、概念理解“机器学习对于高值的预测保守”,这是建模里很常见的现象,尤其在生态、气候、遥感这类数据分布高度偏斜的场景。通常可以从以下几个角度理解:1. 数据分布与样本稀缺在训练集里,高值样本往往非常少,远低于中…

蜂窝物联网模组:智能门禁产品上的关键部件

随着物联网技术的快速发展,蜂窝物联网模组正逐步成为智能门禁系统的关键通信组件。蜂窝模组凭借其广覆盖、高可靠性和低功耗特性,正从传统门禁系统的补充角色转变为智能门禁的核心通信组件,尤其在智慧社区、商业楼宇和政府机构等场景中展现出…

[光学原理与应用-417]:非线性光学 - 线性光学(不引发频率的变化)与非线性光学(引发频率变化)的异同

一、定义与物理机制:线性响应 vs 非线性响应线性光学定义:光与物质相互作用时,介质的极化强度与入射光电场强度呈线性关系(Pϵ0​χ(1)E),输出光强与输入光强成正比(Iout​∝Iin​)-…

深入探讨AI在三大核心测试场景中的应用

随着人工智能(AI)技术的迅猛发展,软件测试领域正经历深刻变革。传统手动测试和基于规则的自动化测试已难以应对日益复杂的系统架构与海量用户行为。AI测试通过引入机器学习、自然语言处理、计算机视觉等技术,显著提升了测试效率、…

[linux仓库]性能加速的隐形引擎:深度解析Linux文件IO中的缓冲区奥秘

🌟 各位看官好,我是egoist2023! 🌍 Linux Linux is not Unix ! 🚀 今天来学习C语言缓冲区和内核缓存区的区别以及缓存类型。 👍 如果觉得这篇文章有帮助,欢迎您一键三连&#xff0c…

一、计算机的数据存储

计算机的世界只有0和1。 1.1 进制 十进制整数->二进制整数:除2倒取余二进制->十进制:权值相加法 结论:1位8进制值 3位二进制值,1位十六进制值 4位二进制值 public class JinZhiDemo {public static void main(String[]…

SpringBoot集成XXL-JOB保姆教程

第一步: 下载xxl-job源码到本地,地址如下: xxl-job: 一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 第二步: 创建…

Debezium日常分享系列之:Debezium 3.2.2.Final发布

Debezium日常分享系列之:Debezium 3.2.2.Final发布Debezium CoreConnector启动时出现难以理解的错误临时阻塞快照失败可能导致数据丢失的问题修复Debezium for OracleDebezium CoreConnector 启动时出现难以理解的错误 我们解决了一个问题,即连接器会因…

Zoom AI 技术架构研究:联合式方法与多模态集成

一、研究背景与概述 在当今数字化转型加速的背景下,人工智能技术正深刻改变企业协作与沟通方式。作为全球领先的视频会议平台,Zoom 已从单纯的通信工具转型为全面的生产力平台,而其 AI 技术架构是这一转变的核心驱动力。本报告将深入分析 Zoom 的 AI 技术架构,特别是其创新…

排序-快速排序 O(n log n)

快排:1、设定一个中间值 q[ lr >>1 ] , 让左右区间来比较2、左边通过 i 依次比较,如果比这个中间值小,就继续 , 直到不符合3、右边通过 j-- 依次比较,如果比这个中间值大,就继续 ,直到不符合4、两边…

【Proteus仿真】定时器控制系列仿真——LED小灯闪烁/流水灯/LED灯带控制/LED小灯实现二进制

目录 0案例视频效果展示 0.1例子1:基于AT89C51单片机的定时器控制小灯闪烁 0.2例子2:基于AT89C51单片机的定时器T0流水灯 0.3例子3:基于AT89C51单片机的定时器控制LED灯带 0.4例子4:基于AT89C51单片机的定时器控制LED闪烁 0…

进阶向:密码生成与管理工具

密码生成与管理工具:从零开始的完全指南在现代数字生活中,密码是保护个人信息和账户安全的第一道防线。随着网络服务的普及,每个人平均需要管理数十个不同账户的密码。一个强大且独特的密码通常应包含12个以上字符,混合大小写字母…

解决 Gitee 中 git push 因邮箱隐私设置导致的失败问题

解决 Gitee 中 git push 因邮箱隐私设置导致的失败问题 在使用 Git 向 Gitee 远程仓库推送代码时,可能会遇到因邮箱隐私设置引发的 git push 失败情况。最近我就碰到了,现在把问题现象、原因和解决方法分享出来。 一、错误现象 执行 git push -u origin …

Flutter的三棵树

“三棵树”是 Flutter 渲染和构建UI的核心机制,理解它们对于掌握 Flutter 至关重要。这三棵树分别是: Widget 树 Element 树 RenderObject 树 它们协同工作,以实现 Flutter 的高性能渲染和高效的响应式编程模型。 Flutter 是声明式的UI&…