创建我自己的Java死锁程序

时间:2016-03-07 09:01:08

标签: java multithreading deadlock

我正在尝试创建一个Java死锁程序。我知道实时我们不会在线程中创建任何死锁。不幸的是,我在一次采访中被要求写一个“使用两个线程的死锁程序”。所以这就是

package Thread.DeadLock;

public class deadLock2 {

  static ThreadSample1 t1 = new ThreadSample1();
  static ThreadSample2 t2 = new ThreadSample2();

  public static void main(String args[]) {

    t1.start();
    t2.start();
  }

  public static class ThreadSample1 extends Thread {
    public void run() {
      System.out.println("In first run method");
      try {
        System.out.println("Holding lock in first one");
        synchronized (t1) {
          System.out.println("t1 going to wait for t2");

          t1.wait();
          System.out.println("t1 finished for waiting");
        }
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }

  public static class ThreadSample2 extends Thread {
    public void run() {
      System.out.println("In second run method");
      try {
        System.out.println("Holding lock for second one");
        synchronized (t2) {
          System.out.println("t2 going to wait for t1");

          t2.wait();
          System.out.println("t2 finished for waiting");
        }
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
}

我可以看到程序卡住了。我假设它处于死锁状态。 t1.start()等待t2完成其任务,t2.start()等待t1完成其任务。现在,当我尝试通过使用t1.notify()通知等待线程来删除死锁时,我得到了IllegalMonitorStateException。 在这种情况下,有人可以告诉如何在不造成任何情况的情况下消除死锁。

3 个答案:

答案 0 :(得分:2)

首先,这不是死锁。正如您所描述的那样,死锁通常是两个或多个线程之间存在循环依赖关系,等待其他线程持有的资源。

这里,每个线程独立地等待自己的通知,这实际上不是系统中任何其他人传递的。即使没有僵局。

其次,IllegalMonitorStateException表示您尝试在监视器上通知/等待线程未持有。换句话说,synchronized / notify之前没有wait

第三,要实现真正的僵局,你可以做这样的事情:

synchronized(t1) {
    synchronized(t2) {
        t2.wait();
    }
    t1.notify();
}

,反之亦然另一个帖子。

答案 1 :(得分:0)

除非当前线程拥有该对象的监视器,否则无法调用notify()/notifyAll()。为此,您必须像对wait()

一样对其进行同步

Javadocs for wait()提到这个:

  

此方法只能由作为此对象监视器所有者的线程调用。有关线程成为监视器所有者的方式的说明,请参阅notify方法。

     抛出:      

IllegalMonitorStateException - 如果当前主题不是此对象监视器的所有者。

来自notify()

  

线程成为对象监视器的所有者之一   方法:

     
      
  • 执行该对象的同步实例方法。
  •   
  • 执行在对象上同步的synchronized语句的正文。
  •   
  • 对于Class类型的对象,通过执行该类的同步静态方法。
  •   

看到这个答案:

Java Wait and Notify: IllegalMonitorStateException

答案 2 :(得分:0)

    for Frame use
      record
         Transaction_Id at 0 range 0 .. 15;
         Protocol_Id at 2 range 0 .. 15;
         Frame_Length at 4 range 0 .. 15;
         Unit_id at 6 range 0 .. 7;
         Function_Code at 7 range 0 .. 6;
         Is_Exception at 7 range 7 .. 7;
      end record;