code: public void unlock() {
  		ArrayList<Runnable> list;
  		Thread t = Thread.currentThread();
  		synchronized (this) {
  			if (t != lockingThread) return;
  			if (--lockedTimes > 0) return;
  			lockingThread = null;
  			list = listeners;
  			listeners = null;
  		}
  		if (list != null) {
  			for (Runnable r : list) r.run();
  		}
  		// notify after listeners
  		synchronized (this) {
  			this.notifyAll();
  		}
  	}
docs: Release the lock.