美文网首页java
Java - 线程死锁

Java - 线程死锁

作者: 全能程序猿 | 来源:发表于2017-07-16 18:44 被阅读0次

Java - 线程死锁

死锁描述了两个或多个线程被永久阻塞的情况,等待彼此。当多个线程需要相同的锁定但以不同的顺序获取时,会发生死锁。Java多线程程序可能会遇到死锁状况,因为synchronized关键字会导致执行线程在等待与指定对象相关联的锁定或监视时阻止。

原文地址: http://blogxinxiucan.sh1.newtouch.com/2017/07/16/Java-线程死锁/

这是一个例子。

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...");
            }
         }
      }
   } 
}

当您编译并执行上述程序时,您会发现死锁情况,以下是程序生成的输出 -

Output

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...");
            }
         }
      }
   } 
}

所以只是改变锁的顺序防止程序进入死锁情况并完成以下结果 -

Output

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...

上面的例子只是让这个概念清楚,然而,这是一个复杂的概念,你应该深入了解它,然后再开发应用程序来处理死锁情况。

上一篇 :Java - Interthread通信

相关文章

  • Java自学-多线程 死锁

    Java 演示多线程死锁 当业务比较复杂,多线程应用里有可能会发生死锁 步骤 1 : 演示死锁 线程1 首先占有对...

  • Synchronized关键字详解2(对非object持锁)

    4.死锁:同步方法容易造成死锁。Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁...

  • Java锁(悲观、乐观锁、CAS原子操作)

    Java死锁发生的必要条件 Java死锁产生的四个必要条件: 互斥使用,即当一个线程占用了资源,其他线程不能使用。...

  • 如何去检测死锁

    如何检测死锁 死锁预防 让线程获取锁的顺序一致 死锁检测 jps 查看java 进程信息 jstack +进程号 ...

  • Java - 线程死锁

    Java - 线程死锁 死锁描述了两个或多个线程被永久阻塞的情况,等待彼此。当多个线程需要相同的锁定但以不同的顺序...

  • Java多线程-死锁的出现和解决

    Java多线程-死锁什么是死锁? 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释...

  • Thread死锁问题

    线程死锁 当线程发生死锁的情况时,用eclipse很难找出真正的原因所在。需要借住jdk自带的“java Visu...

  • 照本宣科的问题

    3条你遵循的多线程最佳实践三条最佳实践我觉得大多数Java程序员都应该遵循: 如何避免死锁?Java多线程中的死锁...

  • java死锁介绍、源码实现及预防(含源码)

    java死锁介绍、源码实现及预防(含源码) 什么是死锁 死锁是 多个线程 之间 相互之间 持有 对方需要的资源,同...

  • Java死锁的简单例子

    Java死锁的简单例子 两个线程互相占有对方需要的资源而不释放,便形成了死锁。 代码如下:Program.java...

网友评论

    本文标题:Java - 线程死锁

    本文链接:https://www.haomeiwen.com/subject/mucxkxtx.html