Java多线程环境下死锁模拟

 更新时间:2021年12月12日 11:41:26   作者:bkpp976  
这篇文章主要介绍了模拟Java多线程环境下的死锁,文章介绍一些死锁的产生条件的相关资料,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你有所帮助

1、死锁产生的条件

  • 互斥:一次只有一个进程可以使用一个资源。其他进程不能访问已分配给其他进程的资源。
  • 不可抢占:不能抢占进程已占有的资源
  • 请求和保持:当一个进程等待其他进程释放资源时,继续占有已经分配的资源
  • 循环等待:存在一个封闭的进程链,使得每个进程至少占有此链中下一个进程所需要的一个资源。

注意:前三个条件都只是死锁存在的必要条件,但不是充分条件。第四个条件是充分条件。以上条件同样适用于线程。

2、模拟多线程环境下死锁的产生

/**
 * 死锁产生的四个条件:互斥 请求和保持 不可抢占 循环等待
 * synchronized锁住对象资源,保证互斥和不可抢占
 * 先持有一个资源,再去申请另一个资源->请求和保持
 */
public class DeadLock {

    // 模拟两个资源
    public static Object lock1 = new Object();
    public static Object lock2 = new Object();

    // 先申请lock1资源,再去申请lock2资源
    public static void getLock1First(){
        synchronized (lock1){
            System.out.println("getlock1");
            getLock2();
        }
    }

    public static void getLock2(){
        synchronized (lock2) {
            System.out.println("lock1->lock2");
        }
    }

    // 先申请lock2资源,再申请lock1资源
    public static void getlock2First(){
        synchronized (lock2){
            System.out.println("getlock2");
            getLock1();
        }
    }

    public static void getLock1(){
        synchronized (lock1){
            System.out.println("lock2->lock1");
        }
    }

    public static void main(String[] args) {
        new Thread(){
            @Override
            public void run() {
                // 太难把控线程运行的时机了 也有可能此线程执行完了lock1->lock2的顺序
                // 直接死循环一直运行
                // 总会刚好遇到线程1刚好获得lock1,线程2刚好获得lock2
                while (true){
                    getLock1First();
                }
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                while (true){
                    getlock2First();
                }
            }
        }.start();
    }
}

死锁:

3、死锁的排查

先进入jdk安装的bin目录,启动命令行,输入命令jps查看运行的线程ID

死锁检测1:

执行jstack -l 线程ID命令

死锁检测2:

可以看到Thread-1Thread-2都在相互等待对方持有的对象的monitor锁释放。

到此这篇关于Java多线程环境下死锁模拟的文章就介绍到这了,更多相关Java多线程死锁模拟内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java链式创建json对象的实现

    java链式创建json对象的实现

    本文主要介绍了java中如何通过最简单的方式实现链式创建json对象,解决创建json代码臃肿的问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 利用idea搭建SSM项目看这一篇就够了

    利用idea搭建SSM项目看这一篇就够了

    SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容),常作为数据源较简单的web项目的框架,下面这篇文章主要给大家介绍了关于利用idea搭建SSM项目的相关资料,需要的朋友可以参考下
    2023-05-05
  • SpringBoot整合WebSocket实现后端向前端发送消息的实例代码

    SpringBoot整合WebSocket实现后端向前端发送消息的实例代码

    WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据,下面这篇文章主要给大家介绍了关于SpringBoot整合WebSocket实现后端向前端发送消息的相关资料,需要的朋友可以参考下
    2023-03-03
  • Spring Security 在 Spring Boot 中的使用详解【集中式】

    Spring Security 在 Spring Boot 中的使用详解【集中式】

    这篇文章主要介绍了Spring Security 在 Spring Boot 中的使用【集中式】,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java实现Excel转PDF的两种方法详解

    Java实现Excel转PDF的两种方法详解

    使用具将Excel转为PDF的方法有很多,在这里我给大家介绍两种常用的方法:使用spire转化PDF、使用jacob实现Excel转PDF,分别应对两种不一样的使用场景,需要的可以参考一下
    2022-01-01
  • Mybatis Mapper中多参数方法不使用@param注解报错的解决

    Mybatis Mapper中多参数方法不使用@param注解报错的解决

    这篇文章主要介绍了Mybatis Mapper中多参数方法不使用@param注解报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • idea项目文件夹横向显示,纵向显示的解决方法

    idea项目文件夹横向显示,纵向显示的解决方法

    这篇文章主要介绍了idea项目文件夹横向显示,纵向显示的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • java 示例讲解循环语句的使用

    java 示例讲解循环语句的使用

    顺序结构的程序语句只能被执行一次。如果您想要同样的操作执行多次,就需要使用循环结构,循环结构就是在循环条件满足的情况下,反复执行特定代码
    2022-04-04
  • Java8新特性之Collectors.joining()实例详解

    Java8新特性之Collectors.joining()实例详解

    在项目中我们常常要对list集合的数据做一些字符串拼接/处理等相关操作,下面这篇文章主要给大家介绍了关于Java8新特性之Collectors.joining()的相关资料,需要的朋友可以参考下
    2023-01-01
  • 智能 AI 代码生成工具 Cursor 安装和使用超详细教程

    智能 AI 代码生成工具 Cursor 安装和使用超详细教程

    Cursor.so 是一个集成了 GPT-4 的国内直接可以访问的,优秀而强大的免费代码生成器,可以帮助你快速编写、编辑和讨论代码,这篇文章主要介绍了智能 AI 代码生成工具 Cursor 安装和使用介绍,需要的朋友可以参考下
    2023-05-05

最新评论