Back

public class NestedMonitorDeadlock {
  public static void main(String[] args) {
    Wrapper w = new Wrapper(new Pair());
    (new Thread1(w)).start();
    (new Thread2(w)).start();
  }
}

class Pair {
  private int hi = 0;
  private int lo = 0;

  public synchronized void inclo() {
    while (lo <= hi)
    try { wait(); } catch ( InterruptedException ex) {}
    lo++;
  }

  public synchronized void inchi() {
    hi++;
    notify();
  }
}

class Wrapper {
  private Pair p;
  Wrapper(Pair x) {p = x;}
  public synchronized void inclo() { p.inclo(); }
  public synchronized void inchi() { p.inchi(); }
}

class Thread1 extends Thread {
  private Wrapper w;
  Thread1(Wrapper x) {w = x;}
  public void run() {
    w.inclo();
  }
}

class Thread2 extends Thread {
  private Wrapper w;
  Thread2(Wrapper x) {w = x;}
  public void run() {
    w.inchi();
  }
}

Back