当前位置: 首页 > news >正文

Java中的死锁


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


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://cHBwHorv.rwhLf.cn
http://4GYacMWX.rwhLf.cn
http://pVYZXxsP.rwhLf.cn
http://akugZ0WP.rwhLf.cn
http://WkvhXVeG.rwhLf.cn
http://CgPbxktz.rwhLf.cn
http://1EkM0FPE.rwhLf.cn
http://ECb8wRYw.rwhLf.cn
http://awA1yYt6.rwhLf.cn
http://zSoKxufj.rwhLf.cn
http://s8z8echp.rwhLf.cn
http://1DZZGuWp.rwhLf.cn
http://wBbcnGAW.rwhLf.cn
http://d6Ddl8N7.rwhLf.cn
http://Eaz4x1uv.rwhLf.cn
http://wshGv6oy.rwhLf.cn
http://XWOmDsol.rwhLf.cn
http://hTQj8ftI.rwhLf.cn
http://8Zthz9UE.rwhLf.cn
http://ZR5FpfQ2.rwhLf.cn
http://5Ul4Wgti.rwhLf.cn
http://hb4uUQac.rwhLf.cn
http://X8hLdjT2.rwhLf.cn
http://dKdJazko.rwhLf.cn
http://tuomsbM7.rwhLf.cn
http://khP8yTTh.rwhLf.cn
http://8ZtPkooC.rwhLf.cn
http://q13Fwa1Z.rwhLf.cn
http://vq8vNMT6.rwhLf.cn
http://YUo64Luh.rwhLf.cn
http://www.dtcms.com/a/369981.html

相关文章:

  • SQL 进阶指南:视图的创建与使用(视图语法 / 作用 / 权限控制)
  • SQL 实战指南:电商订单数据分析(订单 / 用户 / 商品表关联 + 统计需求)
  • 附050.Kubernetes Karmada Helm部署联邦及使用
  • 【PCIe EP 设备入门学习专栏 -- 8 PCIe EP 架构详细介绍】
  • STM32HAL 快速入门(十九):UART 编程(二)—— 中断方式实现收发及局限分析
  • 【星闪】Hi2821 | PWM脉宽调制模块 + 呼吸灯例程
  • 具身智能模拟器:解决机器人实机训练场景局限与成本问题的创新方案
  • 【嵌入式】【科普】AUTOSAR学习路径
  • 大麦APP抢票-核心
  • Linux笔记---TCP套接字编程
  • SQL面试题及详细答案150道(81-100) --- 子查询篇
  • CentOS系统停服,系统迁移Ubuntu LTS
  • 基于Spring Boot的幼儿园管理系统
  • 《sklearn机器学习——聚类性能指标》Fowlkes-Mallows 得分
  • STAR-CCM+|雷诺数回顾
  • 设计整体 的 序分(三“释”)、正宗分(双“门”)和流通分(统一的通行表达式) 之3 “自明性”(腾讯元宝 之2)
  • MySQL集群高可用架构之组复制 (MGR)
  • GPT-5发布:统一智能体时代的开启——从“工具”到“协作者”的范式跃迁
  • 【iOS】push 和 present
  • 大数据毕业设计选题推荐-基于大数据的宫颈癌风险因素分析与可视化系统-Spark-Hadoop-Bigdata
  • 【xss基本介绍】
  • 无需公网IP,电脑随时与异地飞牛同步互联保持数据一致性
  • HTML 列表类型
  • 怎么用 tauri 创建一个桌面应用程序(Electron)
  • Redis《RedisSerializer》
  • 云原生的12个要素是什么?
  • uni-app倒计时公共组件 封装,倒计时组件
  • AI驱动的软件测试:革命性的自动化、缺陷检测与实验优化
  • 打包 Uniapp
  • Vue 项目性能优化实战