首页 > 编程语言 >无涯教程-Java - 处理线程死锁函数

无涯教程-Java - 处理线程死锁函数

时间:2023-12-19 18:31:40浏览次数:34  
标签:... Java Thread lock 无涯 System 死锁 Holding println

死锁描述了一种情况,其中两个或多个线程永远被阻塞,互相等待,当多个线程需要相同的锁但以不同的顺序获得它们时,就会发生死锁。 Java多线程程序可能会遇到死锁情况,因为 synchronized 关键字会导致正在执行的线程在等待与指定对象关联的锁时被阻塞。这是一个示例。

public class TestThread {
   public static Object Lock1 = new Object();
   public static Object Lock2 = new Object();
   
   public static void main(String args[]) {
      ThreadDemo1 T1 = new ThreadDemo1();
      ThreadDemo2 T2 = new ThreadDemo2();
      T1.start();
      T2.start();
   }
   
   private static class ThreadDemo1 extends Thread {
      public void run() {
         synchronized (Lock1) {
            System.out.println("Thread 1: Holding lock 1...");
            
            try { Thread.sleep(10); }
            catch (InterruptedException e) {}
            System.out.println("Thread 1: Waiting for lock 2...");
            
            synchronized (Lock2) {
               System.out.println("Thread 1: Holding lock 1 & 2...");
            }
         }
      }
   }
   private static class ThreadDemo2 extends Thread {
      public void run() {
         synchronized (Lock2) {
            System.out.println("Thread 2: Holding lock 2...");
            
            try { Thread.sleep(10); }
            catch (InterruptedException e) {}
            System.out.println("Thread 2: Waiting for lock 1...");
            
            synchronized (Lock1) {
               System.out.println("Thread 2: Holding lock 1 & 2...");
            }
         }
      }
   } 
}

编译并执行上述程序时,发现死锁情况,以下是该程序产生的输出:

Thread 1: Holding lock 1...
Thread 2: Holding lock 2...
Thread 1: Waiting for lock 2...
Thread 2: Waiting for lock 1...

上面的程序将永远挂起,因为两个线程都无法继续进行并等待彼此释放锁,因此可以通过按CTRL + C退出程序。

死锁解决示例

让无涯教程更改同一程序的锁定和运行顺序,以查看两个线程是否仍然彼此等待-

public class TestThread {
   public static Object Lock1 = new Object();
   public static Object Lock2 = new Object();
   
   public static void main(String args[]) {
      ThreadDemo1 T1 = new ThreadDemo1();
      ThreadDemo2 T2 = new ThreadDemo2();
      T1.start();
      T2.start();
   }
   
   private static class ThreadDemo1 extends Thread {
      public void run() {
         synchronized (Lock1) {
            System.out.println("Thread 1: Holding lock 1...");
            
            try {
               Thread.sleep(10);
            } catch (InterruptedException e) {}
            System.out.println("Thread 1: Waiting for lock 2...");
            
            synchronized (Lock2) {
               System.out.println("Thread 1: Holding lock 1 & 2...");
            }
         }
      }
   }
   private static class ThreadDemo2 extends Thread {
      public void run() {
         synchronized (Lock1) {
            System.out.println("Thread 2: Holding lock 1...");
           
            try {
               Thread.sleep(10);
            } catch (InterruptedException e) {}
            System.out.println("Thread 2: Waiting for lock 2...");
            
            synchronized (Lock2) {
               System.out.println("Thread 2: Holding lock 1 & 2...");
            }
         }
      }
   } 
}

因此,只需更改锁的顺序即可防止程序陷入死锁情况,并完成以下输出:

Thread 1: Holding lock 1...
Thread 1: Waiting for lock 2...
Thread 1: Holding lock 1 & 2...
Thread 2: Holding lock 1...
Thread 2: Waiting for lock 2...
Thread 2: Holding lock 1 & 2...

参考链接

https://www.learnfk.com/java/java-thread-deadlock.html

标签:...,Java,Thread,lock,无涯,System,死锁,Holding,println
From: https://blog.51cto.com/u_14033984/8892170

相关文章

  • 秦疆的Java课程笔记:78 异常 捕获和抛出异常
    异常处理五个关键词:try,catch,finally,throw,throws写一个会出错的代码:publicclassTest1{publicstaticvoidmain(String[]args){inta=1;intb=0;System.out.println(a/b);}}====运行报错====Exceptionint......
  • JavaWeb - Day10 - 案例 - 部门管理、员工管理
    01.案例-准备工作需求&环境搭建1、部门管理部门管理功能开发包括:查询部门列表删除部门新增部门修改部门2、员工管理员工管理功能开发包括:查询员工列表(分页、条件)删除员工新增员工修改员工环境搭建步骤:准备数据库表(dept、emp)创建......
  • 无涯教程-URL Processing函数
    URL代表"统一资源定位器",代表万维网上的资源,例如网页或FTP目录。本节向您展示如何编写与URL通信的Java程序。URL可以分为以下部分:protocol://host:port/path?query#ref例sofprotocolsincludeHTTP,HTTPS,FTP,andFile.Thepathisalsoreferredtoasthefilen......
  • 一些有趣和实用的Java开发技巧和编码技巧
    当涉及到Java开发技巧和编码技巧时,有一些有趣和实用的技巧可以帮你提高效率和代码质量。以下是一些示例:1.使用Lambda表达式List<Integer>numbers=Arrays.asList(1,2,3,4,5);//使用Lambda表达式计算偶数的总和intsum=numbers.stream().(n->n%20......
  • Java Properties配置文件使用方法入门详解​
    JavaProperties配置文件使用方法详解使用配置文件的优点:好处1:可以把软件的设置永久化存储好处2:如果我们要修改参数,不需要改动代码,直接修改配置文件就可以了Properties配置文件文件后缀名为.properties,其内容是按键值对存储的。前面为键,后面为值。properties是一个双列集合,拥有Ma......
  • java,类、实例化、构造方法、this关键字、方法重载
    编写类的步骤:1、定义类名2、编写类的属性3、编写类的方法public 访问修饰符,表示在整个项目中都可以调用,也可以用其他词使用class关键字来定义类,如下,定义一个Cat类给了属性和方法,动态方法是没有static的publicclassCat{//属性Stringni_chen;Stringco......
  • jQuery与JavaScript与ajax三者的区别与联系
    简单总结:1、JS是一门前端语言。2、Ajax是一门技术,它提供了异步更新的机制,使用客户端与服务器间交换数据而非整个页面文档,实现页面的局部更新。3、jQuery是一个框架,它对JS进行了封装,使其更方便使用。jQuery使得JS与Ajax的使用更方便 关系比喻:若把js比作木头,那么jquery就是......
  • 秦疆的Java课程笔记:77 异常 Error和Exception
    实际工作中,遇到的情况不可能非常完美。比如:写好的某个模块,用户输入不一定符合要求;程序要打开某个文件,但这个文件可能不存在或者格式不对;你要读取数据库的数据,数据可能是空的;程序在跑着,内存或者硬盘满了……等等情况。软件程序在运行过程中,这类例外情况,通称“异常”,英文:Exception......
  • 无涯教程-Java - Comparator 比较器函数
    TreeSet和TreeMap都按排序顺序存储元素。但是,比较器(Comparator)精确地定义了排序顺序的含义。比较器(Comparator)接口定义了两个方法:compare()和equals()。Compare方法intcompare(Objectobj1,Objectobj2)obj1和obj2是要比较的对象。如果对象相等,则此方法返回零。如果obj......
  • 启动微服务报错:java.lang.IllegalStateException: Service id not legal hostname (se
    Order微服务通过opneFeign调用storage和account时报错原因分析:服务名称不能有下划线,可以使用中划线,Springcloud无法识别下划线,将下划线改为中划线即可注意:这个改了之后,你在进行远程调用的时候,接口对应的方法接口也需要相应改变【分布式开发,一个微服务模块修改了,很可能......