如何写出一个会产生死锁的程序

时间:2021-11-30 20:51:16

写多线程的程序的时候要避免产生死锁,那我们首先要知道怎么会产生死锁才能预防死锁。接下来用java写一个会产生死锁的程序。

新建一个类DeadLock

public class DeadLock implments Runnable{

      public boolean flag;

      public static Object o1 = new Object();

      public static Object o2 = new Object();

     private DeadLock(boolean flag){

         this.flag = flag;//在构造方法里输入一个状态

     }

     @Override

     public void run(){

         if(this.flag){

         synchronized(o1){

              try{

                  Thread.sleep(1000);//在第一个线程锁住o1对象时睡眠1秒,那么这一秒内是线程占着o1

                   }catch(Exception e){

                   e.printStackTrace();

                   }

         synchronized(o2){

                  System.out.println("01 is ok");

                  }

         }else{

                 synchronized(o2){

              try{

                  Thread.sleep(100);//线程o2锁住o2,那么前0.1秒内是o2占着o2,在0.1秒后,线程2请求o1而此时o1被线程1占着

  //所以o2等待o1的结果。1秒后,线程请求o2,而o2被线程2占着,那么线程1又要等待线程2的结果,于是他们互相等待就产生

  //死锁了

                   }catch(Exception e){

                   e.printStackTrace();

                   }

         synchronized(o1){

                  System.out.println("02 is ok");

                  }

                  }

         }

    }

}

//编写测试类

public class TestDeadLock{

            public static void main(String[] args){

               Thread t1 = new Thread(new DeadLock(true));

               Thread t2 = new Thread(new DeadLock(false));

               t1.start();

               t2.start();

            }

}

所以写死锁最主要的是创建一个线程互相等待结果的状态,最简单的就是在一个线程锁住一个对象1的时候去请求对象2,而第二个线程在锁住对象2的同时去请求对象1,就ok了。