public class Lock
{
  private int count=0;
  private Thread lockThread= null;

  public Lock() { }

  public synchronized void lock()
  {
    if (lockThread==Thread.currentThread())
      count++;
    else
    {
      while (lockThread!=null)
      {
        try { wait(); }
        catch (InterruptedException I)
        { throw new Error("wait interrumpido"); }
      }

      if (count!=0) throw new Error("count es "+count);
      lockThread= Thread.currentThread();
      count= 1;
  } }

  public synchronized void unlock()
  {
    if (lockThread==null) throw new Error("Lock Inconsistente");
    if (--count<=0)
    {
      if (count<0) throw new Error("count es "+count);
      lockThread= null;
      notify();
} } }
