Java死锁

2023-11-09

一、死锁是什么

死锁:当两个线程相互等待对方释放同步监视器便会发生死锁。

死锁产生的4个必要条件:

1.互斥条件:一个资源每次只能被一个线程使用。

2.请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。

3.不剥夺条件:线程已获得的资源在未使用完之前,不得强行剥夺。

4.循环等待条件:若干线程之间形成头尾相接的循环等待资源关系。

二、如何避免死锁

避免死锁的方法是允许前3个条件存在,破坏第4个条件。

三、产生死锁的程序

public class A {
    public synchronized void bar(B b) {
        System.out.println("当前线程:" + Thread.currentThread().getName() + "进入到A实例的bar()方法");
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("当前线程:" + Thread.currentThread().getName() + "准备执行B实例的last()方法");
        b.last();
    }
    public synchronized void last() {
        System.out.println("进入到A的同步方法last()");
    }
}
public class B {
    public synchronized void foo(A a) {
        System.out.println("当前线程:" + Thread.currentThread().getName() + "进入到B实例的foo()方法");
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("当前线程:" + Thread.currentThread().getName() + "准备执行A实例的last()方法");
        a.last();
    }
    public synchronized void last() {
        System.out.println("进入到B的同步方法last()");
    }
}
public class Deadlock implements Runnable{
    A a = new A();
    B b = new B();
    public void init() {
        Thread.currentThread().setName("主线程");
        b.foo(a);
    }
    public void run() {
        Thread.currentThread().setName("副线程");
        a.bar(b);
    }

    public static void main(String[] args) {
        Deadlock deadlock = new Deadlock();
        new Thread(deadlock).start();
        deadlock.init();
    }
}

其中,运行Deadlock的main方法结果如下:

当前线程:主线程进入到B实例的foo()方法
当前线程:副线程进入到A实例的bar()方法
当前线程:主线程准备执行A实例的last()方法
当前线程:副线程准备执行B实例的last()方法

分析:

Deadlock执行时,一共有2个线程在运行,其中主线程进入到B实例的foo()方法,获得了B对象的锁,进入休眠阶段;此时副线程获取CPU运行资源,副线程进入到A实例的bar()方法,获得了A对象的锁,进入休眠阶段;然后主线程准备执行A实例的last方法,但由于A对象的锁此时被副线程占有,主线程被阻塞,等待A对象的锁被副线程释放;此时副线程准备执行B实例的last方法,但由于B对象的锁被主线长占有,则副线程被阻塞,等待B对象的锁被主线程释放。最后,主线程和副线程相互等待对方释放锁发生死锁。




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java死锁 的相关文章

  • 在 JRE 级别限制密码套件

    我们的 Java 应用程序公开了许多不同的接口 SMTP FTP HTTP 并通过 SSL TLS 进行保护 现在的目标是限制这些接口上允许的密码套件仅包含 强 密码套件 我已经有了一个列表 并且很清楚如何使其适用于特定套接字 socket
  • 如何迭代 stringtemplate 中的 java 列表?

    我想迭代字符串模板内的休眠查询结果 我一直在寻找例子 但找不到任何东西 你能帮忙吗 谢谢 语法看起来像
  • java.lang.NoSuchMethodError: org.mockito.Mockito.framework()Lorg/mockito/MockitoFramework

    我一直面临一个特殊的问题 基本上 当我正常运行 Mockito 测试 即 作为 Junit 测试运行 时 它会出现以下错误 有人可以帮我看看我的错误是什么吗 收到的错误 java lang NoSuchMethodError org moc
  • 点击 Java Web 服务:curl 或 URLConnection

    我使用的 Java 服务器在以下 URL 上公开 RESTful API http localhost 8080 my server 文档建议使用curl用于提交简单的PUT请求 文件上传 并强烈建议用户使用与示例中提供的完全相同的参数 所
  • MySQL 和 Hibernate 之间的主键自增由谁负责?

    MySQL CREATE TABLE role id role INT 11 unsigned NOT NULL AUTO INCREMENT PRIMARY KEY id role AUTO INCREMENT 1 休眠 Entity p
  • 为什么这个基于java配置的Spring应用程序不能正常工作

    我最近开始了一个使用 Spring 框架的项目 目标是在没有 XML 配置文件 只有 Java 代码的情况下开发它 目前 我将以下文件添加到我的项目中 WebAppConfig java EnableWebMvc ComponentScan
  • Spring Security 中 Web 忽略和 Http 允许之间的区别?

    这两种方法有什么区别 Override protected void configure HttpSecurity http throws Exception http authorizeRequests antMatchers api p
  • 在循环中使用 if 语句? - 加工

    假设我必须在 for 循环中使用 if 语句 并且 for 循环在特定条件下触发 而 if 语句仅在 for 循环达到特定阶段时触发 例如 条件是一个计数器 当发生特定事件 例如球从屏幕上掉下来 时 该计数器会进行计数 每次球穿过屏幕时 都
  • Java如何从字符串实例化一个类[重复]

    这个问题在这里已经有答案了 可能的重复 在 Java 中从变量创建新类 https stackoverflow com questions 1268817 create new class from a variable in java 我
  • GAE 上奇怪的 500 错误

    我今天开始在我的应用程序上收到此错误 根本不记得更改任何内容 每当我在本地尝试时它都工作正常 但部署后我会收到此错误 EXCEPTION java lang ClassNotFoundException se myApp server My
  • 在 Java 中对多语言环境字符串进行排序

    我正在尝试按字符串字段 国家 地区 对对象列表进行排序 每个国家 地区都使用其母语 阿根廷 澳大利亚 奥地利 例如 我想要做的是让 出现在 A 国家之后 因为字母 对应于拉丁语 B 我正在尝试使用默认的 Collat er 但非拉丁名称仍然
  • 使用 GIN 注入 Class

    有没有办法注入类类型Class
  • 如何修复XSS漏洞

    我们正在使用 fortify 扫描 java 源代码 它抱怨以下错误 Method abc sends unvalidated data to a web browser on line 200 which can result in th
  • 返回 Consumer 表达式内的 Method 值

    我试图在方法中返回一个布尔值 并且我正在使用消费者函数 有什么方法可以直接在 Consumer 表达式中返回该值吗 这是代码 private static boolean uuidExists UUID uuid MySQL getResu
  • Spring WebFlux:在 Spring Data MongoDB 反应存储库中的 null 值时发出异常?

    我正在尝试学习如何使用 MongoDB 反应存储库spring boot 2 0 0 M2 但我担心我没有按预期做事 这是我的方法之一 试图找到一个User通过他们的电子邮件 但如果没有 该方法应该抛出异常 Override public
  • 使用电子邮件、用户名和密码进行 Firebase 身份验证

    我想知道是否可以使用电子邮件和用户 ID 密码登录 我有一个项目 我希望用户添加一个唯一的号码 实际上是我们公司提供的工作识别号码 以便能够签名参与该计划的人员将继续留在公司就业 即使电子邮件和密码正确但用户 ID 错误 我也需要 fire
  • 线程缓存和 Java 内存模型

    我正在尝试了解 Java 内存模型和线程 据我了解 每个线程都有 主 内存的本地副本 因此 如果一个线程尝试更改int变量 例如某个对象的变量 它会缓存int变量 如果它更改它 其他线程可能看不到更改 但是如果线程缓存一些对象而不是 int
  • JPanel 无法使用 setSize 和 setPreferedSize

    请解释为什么它不起作用 您也可以发布解决方案来解决此问题 非常感谢您提前 public class Run extends JFrame Fields static JPanel jpanel private int x y Constru
  • javaFX,抛出 NullPointerException,位置是必需的

    我看过其他答案 但没有任何帮助我 抱歉 GUI新手只知道swing的基础知识 这是主课 package application import javafx application Application import javafx fxml
  • 为什么 JDOM 的 getChild() 方法返回 null?

    我正在做一个关于 html 文档操作的项目 我想要现有 html 文档中的正文内容将其修改为新的 html 现在我正在使用 JDOM 我想在我的编码中使用 body 元素 为此 我在编码中使用了 getChild body 但它向我的程序返

随机推荐

  • 经典的生产者和消费者模型问题

    典型的生产者 消费者问题 可以使用 Java 中的 java util concurrent 包提供的 BlockingQueue 来实现 BlockingQueue 是一个线程安全的队列 它可以处理这种生产者 消费者的场景 以下是一个示例
  • QT - 10进制转2进制,2进制需要按16位显示

    可以使用 QString number 函数将十进制数字转换为二进制字符串 并在转换之后使用 QString leftJustified 函数居左对齐字符串 如下所示 int number 42 QString binaryString Q
  • 计算机中找不到msvcp140.dll无法继续执行代码,解决方法

    DLL是Dynamic Link Library的缩写 意为动态链接库 dll文件是电脑系统及软件运行的重要文件 电脑如果丢失dll文件 那么很多软件跟游戏都是无法运行的 msvcp140 dll丢失这个问题就有很多小伙伴遇到 小编今天就分
  • Python 笔记 — 面向对象基础

    目录 一 面向过程和面向对象 1 面向过程 Procedural Programming 2 面向对象 Object Oriented Programming OOP 3 区别与对比 二 类和对象 1 类 Class 1 1 定义 1 2
  • 北漂9年了,37岁的我跳槽进了国企,开启了一段新的人生旅程

    背景 上一次的博客是2021 02 01发表的年终总结 距离现在也有半年的时间没有更新博客了 这段时间只写过一篇文章 关于孩子教育的几点分享 确实有些尴尬 这是因为年初的时候我跳槽了 入职了一家新公司 是一家国企 而且是国企中的央企 是教育
  • Python 遗传算法求解Stackelberg均衡问题(带概率约束)

    目录 引言 遗传算法 关键词解释 MCMC Stackelberg 算法思路 求解某一次博弈过程中的遗传算法逻辑 各文件 模块 间调用关系 求解结果 在50轮博弈中 下层的决策变化 在50轮博弈中 上层的决策变化 放在三维空间中 z轴为各自
  • Windows安装Pytorch3d

    Windows安装Pytorch3d 1 前提 安装Visual Studio 2019 我记得必须是2017 2019之间的版本 我一开始用的是2022的版本就安装不了 网址 pytorch和pytorch3d cuda和NVIDIA C
  • Python计算机视觉编程第六章——图像聚类(K-means聚类,DBSCAN聚类,层次聚类,谱聚类,PCA主成分分析)

    Python计算机视觉编程 图像聚类 一 K means 聚类 1 1 SciPy 聚类包 1 2 图像聚类 1 1 在主成分上可视化图像 1 1 像素聚类 二 层次聚类 三 谱聚类 图像聚类 聚类概念 无监督学习 没有标签 对于监督学习问
  • 利用Docker快速部署hadoop、hive和spark

    文章目录 一 配置文件yml 1 docker compose yml 二 执行脚本 1 启动脚本run sh 2 关闭脚本stop sh 一 配置文件yml 1 docker compose yml version 3 4 service
  • maven引用spire相关jar

  • lua安装不成功

    usr local lib libreadline so 6 undefined symbol PC A by Wooce cd usr local lib mkdir temp mv libreadline temp ldconfig 再
  • mysql load data infile 报错 1290 处理方法

    mysql load data infile 命令导入数据报错 16 06 13 load data infile var lib mysql test employee csv into table emp fields terminat
  • shell执行神器,赶紧来围观(python,附源码)

    前言 我们在python代码里时常会用shell调起其他进程执行 有时调起进程的不止一个 非常多 但又不希望他们一个一个跑 或全部一起跑 就需要用到线程池 但是有些进程之间有依赖关系 比如进程A必须完成后进程B才可以执行 还需要额外的逻辑保
  • 条件概率(四)

    定义 设A B是两个事件 且P A gt 0 称 P B A 为在事件A发生的条件下事件B发生的条件概率 条件概率符合概率论中的三个条件 1 非负性 对于每一事件B 有P B A 0 2 规范性 对于必然事件S 有P S A 1 3 可列可
  • 随机森林筛选变量(Python实现)

    文章转自每日一Python公众号 当数据集的特征过多时 容易产生过拟合 可以用随机森林来在训练之后可以产生一个各个特征重要性的数据集 利用这个数据集 确定一个阈值 选出来对模型训练帮助最大的一些特征 筛选出重要变量后可以再训练模型 本文所用
  • linux学习第一篇:在VirtualBox下安装linux操作系统

    转载地址 https blog csdn net yuchao2015 article details 52132270 感谢博主提供如此详细的linux安装地址 目标 在linux服务器上部署Java开发的网站 工具 VirtualBox
  • 绕过CDN查找真实IP方法总结

    什么是CDN CDN的全称是Content Delivery Network 即内容分发网络 CDN是构建在现有网络基础之上的智能虚拟网络 依靠部署在各地的边缘服务器 通过中心平台的负载均衡 内容分发 调度等功能模块 使用户就近获取所需内容
  • c++(c#)单例模式

    TOC 单例顾名思义就是一个类只实例化一个单例对象 单例模式常见的写法有懒汉式和饿汉式 首先给出一个懒汉式的写法 include
  • Go面试必会基础题(5)

    Go面试必会基础题 1 Go面试必会基础题 2 Go面试必会基础题 3 Go面试必会基础题 4 Go面试必会基础题 5 Go面试必会基础题 6 文章目录 1 Goroutine 的调度器是如何工作的 2 在 Go 语言中如何进行内存对齐 3
  • Java死锁

    一 死锁是什么 死锁 当两个线程相互等待对方释放同步监视器便会发生死锁 死锁产生的4个必要条件 1 互斥条件 一个资源每次只能被一个线程使用 2 请求与保持条件 一个线程因请求资源而阻塞时 对已获得的资源保持不放 3 不剥夺条件 线程已获得