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

线程死锁相关知识点

文章目录

        • 一、线程死锁的核心特性
        • 二、死锁的典型诱因:同步嵌套
        • 三、死锁产生的关键锁特性:不可抢占
        • 四、锁的本质与互斥性

一、线程死锁的核心特性
  • 不抛掷异常:线程死锁是指两个或多个线程相互等待对方持有的资源。是一种程序运行时的状态异常,而非代码语法或逻辑错误,因此Java等编程语言中,死锁不会主动抛出异常。死锁发生时,相关线程会进入无限期阻塞状态,程序可能表现为卡顿、无响应,但不会有明确的错误提示,需要通过日志分析、线程dump等方式排查。
二、死锁的典型诱因:同步嵌套
  • synchronized同步中嵌套同步:这是死锁最常见的场景之一。当线程A持有锁1,同时尝试获取锁2;而线程B持有锁2,同时尝试获取锁1时,就会因互相等待对方释放锁而陷入死锁。
    • 示例:
      // 线程A的操作
      synchronized(lock1) {// 持有lock1后,尝试获取lock2synchronized(lock2) {// 执行操作}
      }// 线程B的操作
      synchronized(lock2) {// 持有lock2后,尝试获取lock1synchronized(lock1) {// 执行操作}
      }
      
    上述代码中,若线程A和线程B同时执行,可能分别持有lock1和lock2,进而互相等待对方释放锁,导致死锁。
三、死锁产生的关键锁特性:不可抢占
  • 不可抢占锁的定义:指线程获取的锁只能由自身主动释放(如执行完synchronized代码块、调用wait()方法等),其他线程无法强制抢占或剥夺该锁。
  • 与死锁的关联:正因为锁不可抢占,当两个线程分别持有对方需要的锁时, neither can force the other to release the lock,只能无限期等待,从而形成死锁。
四、锁的本质与互斥性
  • 锁的本质:是控制线程互斥访问共享资源的权限标识。一个锁在同一时刻只能被一个线程持有,其他线程若想获取该锁,必须等待持有线程释放。
  • 为什么不会出现两个线程同时占有同一锁
    锁的设计基于互斥原则,其内部通过状态标记(如是否被持有)和等待队列实现。当线程尝试获取锁时,若锁未被持有,则当前线程标记为持有者;若已被持有,则当前线程进入等待队列,直到锁被释放后重新竞争。因此,同一锁不可能被两个线程同时占有,这是保证线程安全的基础。
http://www.xdnf.cn/news/17484.html

相关文章:

  • 如何在 Ubuntu 24.04 LTS 或 22.04/20.04 上安装 Apache Maven
  • 特征值和特征向量的直觉
  • DeepSeek辅助编写的带缓存检查的数据库查询缓存系统
  • Omron(欧姆龙)SysmacStudio软件下载,定期更新(最新更新到1.63升级包)
  • 软件销售跟进思路
  • 网络基础——网络层级
  • HTML应用指南:利用GET请求获取全国Apple Store 零售店位置信息
  • 内网穿透原理与部署实战指南:从理论到企业级应用
  • pycharm常见环境配置和快捷键
  • 五、SpringBoot工程打包与运行
  • 登录注册前端详细实现 (Angular 15+)
  • AI漫画翻译器-上传图片自动翻译,支持多语言
  • OpenAI 的 GPT-5 来了
  • 提升LLM服务效率的秘密武器——vLLM!
  • 企业本地知识库助手 大模型+本地知识库
  • 五、CV_ResNet
  • 深入理解模板方法模式:框架设计的“骨架”艺术
  • 豆包新模型矩阵+PromptPilot:AI开发效率革命的终极方案
  • Netflix Live架构学习笔记(一)
  • 频谱图学习笔记
  • 浏览器面试题及详细答案 88道(01-11)
  • (第二篇)spring cloud之Eureka注册中心
  • 控制建模matlab练习12:线性状态反馈控制器-①系统建模
  • 快速入门flask应用(从入门到实战)
  • Fabarta个人专属智能体:三维搜索链+动态大纲重构教材开发范式
  • C++ 模拟实现 map 和 set:掌握核心数据结构
  • 无人机遥控器教练模式技术要点
  • Android 之 OOM的产生和解决办法
  • openpnp - 不连接设备,只大概测试一下摄像头是否好使
  • 汉明码:从原理到实现的深度解析