死锁知识记录

news/2024/12/22 14:58:21/

一、类型

  • 一般性死锁:这是最经典的死锁方式。指的是多个线程的执行下必须拥有多个资源,但是这些资源又分别被不同的线程占有着,即造成了一种僵持的状态。

  • 嵌套性死锁:指的就是锁的互相嵌套使用。上面这种情况的死锁类型,其实就属于嵌套性死锁。

重入性死锁:指的是多线程环境下,若当前线程重复调用一个方法则可能因为代码逻辑里的边界情况从而导致死锁。

所以,Java之后无论是Synchronized还是Lock在可重入方面都会维护一个计数器来记录当前线程的重入次数,从而进入不同的代码逻辑,就是为了避免死锁的发生。

二、死锁原理

  • 互斥条件

某资源一次只能一个线程访问,该资源只要分配给某个线程,其它线程就无法再访问,直到该线程访问结束。

  • 请求与保持条件

线程在已经占有至少一个资源的情况下还可以继续请求占有资源。

  • 不可抢占条件

    资源若已被其它线程占有,那么想要获取它就只能等待,不能因为你需要该资源就将其抢占。

  • 循环等待条件

在竞争环境中存在一个线程等待链,使得每个线程都占有上一个线程所需的至少一种资源。

只有以上四个条件同时满足,线程才会因为资源分配产生矛盾,死锁才有可能发生。

三、死锁解除

  • 破坏请求与保持条件

请求与保持指线程请求资源的同时必须始终持有资源,所以我们可以在线程开始运行之前,一次性地申请其在整个运行过程中所需的全部资源。直至使用完再释放。

  • 破坏不可抢占条件

想要达到这个目的代表着你要去抢占别的线程已经或正在持有的资源,这对于Synchronized是无能为力的。但是我们可以使用Lock呀!在JDK层面,juc包(java.util.concurrent)提供的Lock可以轻轻松松做到。

  • 破坏循环等待条件

若是每个线程都依赖上一线程所持有的资源,那么整个线程链就会像闭环的贪吃蛇一样,导致资源无法被释放。因此就需要某一个线程释放资源,从而打破循环。

四、应用

  • 尽量将程序设置为可中断的

interrupt()方法,这个方法可以请求调用此方法的线程触发中断机制,该线程可以自身决定是否释放资源。若是已经发生了死锁,只要它放弃资源便可打破。

  • 为锁添加时限

除此之外还可以为尝试获取锁的线程添加一个超时等待时间。若线程在规定时间内获取不到锁则放弃,这样就可以避免线程无脑请求,同时也会释放该线程已有的资源,让其它线程有机会获取到锁,可以开放化一个相对封闭的资源环境。

  • 保持加锁顺序

对于多个线程如果需要对方所持有的锁,那么就要尽量按照相同的顺序加锁,这样就能够避免因为各个线程获取锁的顺序混乱导致死锁。


http://www.ppmy.cn/news/90130.html

相关文章

Java Servlet相关面试题

一、什么是servlet? Servlet是运行在java服务器中的小型Java程序。 作用:接收用户请求,并对请求作出处理,将处理结果相应给客户端。 Servlet是JavaWeb三大组件(Servlet、过滤器,监听器 )之一…

Ansys Zemax | 如何将高斯光整形为平顶光

概要 本文展示了如何设计光束整形器将激光器产生的高斯分布的光转换为平顶分布的光输出。(联系我们获取文章附件) 介绍 光束整形光学元件可以将入射光的光强分布转换为其他特定的分布输出。最常见的例子就是将激光器产生的高斯分布的光转换为平顶&#x…

基于Spring Boot的仿豆瓣平台

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 后端为了提高性能和用户体验,该系统平台使用Spring Boot集合Spring,Spring MVC和MyBatis框架做基础,并且集成Spring Data框架,MySQL做数据持久化,Redis缓存提高速度&…

中国人民大学与加拿大女王金融硕士国际班——全方位培养金融人才,你心动了吗

中国人民大学与加拿大女王大学中外合作办学的金融硕士项目有国际班(使用英文授课,无工作经验要求)和高管班(使用中文授课,一般需在中国金融行业拥有至少7年以上的工作经验)两个班次,属于滚动式录…

C++第六章:函数

函数 一、函数基础1.0 简介形参和实参形参列表函数的返回类型 1.1 局部对象自动对象局部静态对象 1.2 函数声明在头文件中进行函数声明 1.3 分离式编译编译和链接多个源文件 二、参数传递2.1 传值参数指针形参 2.2 传引用参数使用形参返回额外信息 2.3 const形参和实参指针或引…

(一)微服务中间键工作原理——nacos客户端服务注册原理说明及源码解读

前言 本节内容我们主要介绍一下中间键nacos的客户端服务注册原理及其源码解读,便于我们理解nacos作为服务注册中心的具体实现。在springcloud的微服务体系中,nacos客户端的注册是通过使用spring的监听机制ApplicationListener实现的。学习本节内容&…

《Spring Guides系列学习》guide21 - guide25

要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

认识SpringBoot

什么是Spring Spring是一个开源框架,2003年兴起的一个轻量级的java开发框架,作者:Rod Johnson Spring是为了解决企业级应用开发的复杂性而创建,简化开发 Spring是如何简化Java开发的 为降低Java开发的复杂性,Spring…