Java 线程死锁的问题解决办法

 更新时间:2017年09月25日 14:58:34   作者:Lovnx  
这篇文章主要介绍了 Java 线程死锁的问题解决办法的相关资料,希望通过本大家能帮助到大家,遇到类似问题能够解决,需要的朋友可以参考下

 Java 线程死锁的问题解决办法

【线程死锁】 

原因:两个线程相互等待被对方锁定的资源

代码模拟:

public class DeadLock {
  public static void main(String[] args) {
    Object obj = new Object();
    Object obj1 = new Object();
    DeadLockThread1 D1 = new DeadLockThread1(obj, obj1);
    DeadLockThread2 D2 = new DeadLockThread2(obj, obj1);
    new Thread(D1,"线程1").start();
    new Thread(D2,"线程2").start();
  }
}

class DeadLockThread1 implements Runnable {
  private Object obj;
  private Object obj1;

  public DeadLockThread1(Object obj, Object obj1) {
    this.obj = obj;
    this.obj1 = obj1;
  }

  @Override
  public void run() {
    synchronized (obj) {   //DeadLockThread1锁定obj对象
      try {
        Thread.sleep(1000);
        synchronized (obj1) { //等待锁定obj1对象,obj对象已被DeadLockThread2锁定
          obj1.getClass();
        }
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

class DeadLockThread2 implements Runnable {
  private Object obj;
  private Object obj1;

  public DeadLockThread2(Object obj, Object obj1) {
    this.obj = obj;
    this.obj1 = obj1;
  }

  @Override
  public void run() {
    synchronized (obj1) {   //DeadLockThread2锁定obj2对象
      try {
        Thread.sleep(1000);
        synchronized (obj) { //等待锁定obj对象,obj对象已被DeadLockThread1锁定
          obj.getClass();
        }
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

查看方式:

1、【cmd】下输入【jconsole】

2、选择测试线程并点击右下角【连接】,左上角选择【线程】,左下角选择【检测死锁】

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望通过本文能帮助到大家,谢谢大家对本站的支持!

相关文章

  • springcloud干货之服务注册与发现(Eureka)

    springcloud干货之服务注册与发现(Eureka)

    这篇文章主要介绍了springcloud干货之服务注册与发现(Eureka) ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 深入理解Java8新特性之接口中的默认方法和静态方法

    深入理解Java8新特性之接口中的默认方法和静态方法

    从Java8开始,程序允许在接口中包含带有具体实现的方法,使用default修饰,这类方法就是默认方法。默认方法在接口中可以添加多个,并且Java8提供了很多对应的接口默认方法,接下来让我们一起来看看吧
    2021-11-11
  • hibernate框架环境搭建具体步骤(介绍)

    hibernate框架环境搭建具体步骤(介绍)

    下面小编就为大家带来一篇hibernate框架环境搭建具体步骤(介绍)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java程序控制逻辑—流程控制

    Java程序控制逻辑—流程控制

    这篇文章主要介绍了Java程序的控制逻辑流程控制,流程控制中最基本的就是条件执行,也就是说,一些操作只能在某些条件满足的情况下才执行,在一些条件下执行某种操作,在另外一些条件下执行另外的操作,需要的朋友可以参考一下
    2022-01-01
  • Java实例化类详解

    Java实例化类详解

    学习JAVA这门面向对象的语言,实质就是不断地创建类,并把类实例化为对象并调用方法。对于初学JAVA的人总搞清楚对象是如何实例化的,假如类之间存在继承关系,那就更糊涂了。下面我们通过两个例题来说明对象的实例化过程。
    2016-03-03
  • Java8中Optional的一些常见错误用法总结

    Java8中Optional的一些常见错误用法总结

    我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional,下面这篇文章主要给大家介绍了关于Java8中Optional的一些常见错误用法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-07-07
  • Spring Cloud使用Feign实现Form表单提交的示例

    Spring Cloud使用Feign实现Form表单提交的示例

    本篇文章主要介绍了Spring Cloud使用Feign实现Form表单提交的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • java为什么会出现精度丢失这种现象你知道吗

    java为什么会出现精度丢失这种现象你知道吗

    这篇文章主要介绍了Java精度丢失的问题,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下,希望能够给你带来帮助
    2021-08-08
  • 解决mybatis-plus 查询耗时慢的问题

    解决mybatis-plus 查询耗时慢的问题

    这篇文章主要介绍了解决mybatis-plus 查询耗时慢的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • eclipse中没有SERVER的解决办法(超详细)

    eclipse中没有SERVER的解决办法(超详细)

    使用eclipse进行tomcat配置时,经常会发现一个重要的问题就是打开eclipse之后没有了server选项,所以本给大家详细介绍了eclipse中没有SERVER的解决办法,文中有详细的图文讲解,需要的朋友可以参考下
    2023-12-12

最新评论