class Thread1 extends Thread
{
    private DeadLock dl;
    public Thread1(DeadLock lock)
    {
      super();
      dl = lock;
    }
    public void run()
    {
        System.out.println("Hello from a thread1!");
        while(true) dl.instanceMethod1();
    }
}
class Thread2 extends Thread
{
    private DeadLock dl;
    public Thread2(DeadLock lock)
    {
      super();
      dl = lock;
    }
    public void run()
    {
        System.out.println("Hello from a thread2!");
        while(true) dl.instanceMethod2();
   
    }
}

public class DeadLock
{
   private Object lock1 = new Object ();
   private Object lock2 = new Object ();
   private int x = 0;

   public void instanceMethod1 ()
   {
      synchronized (lock1)
      {
         synchronized (lock2)
         {
	   x=x+1;
         }
      }
   }
   public void instanceMethod2 ()
   {
      synchronized (lock2)
      {
         synchronized (lock1)
         {
           x=x-1;
         }
      }
   }
   static public void main(String [] args)
   {
      DeadLock dl = new DeadLock();
      Thread1 t1 = new Thread1(dl);
      Thread2 t2 = new Thread2(dl);
      t1.start();
      t2.start();
      try {
        t1.join();
        t2.join();
      }
      catch(InterruptedException e)
      {
        e.printStackTrace();
      }
   }
}
