code: public final void acquire(long timeout) throws RuntimeException {
  		synchronized (this.LOCK) {
  			long start = System.currentTimeMillis();
  
  			while (this.owner != null) {
  				if (this.owner.get() == Thread.currentThread()) {
  					this.acquire++;
  
  					return;
  				}
  
  				try {
  					if (timeout == -1) {
  						this.LOCK.wait();
  					} else {
  						this.LOCK.wait(timeout);
  					}
  				} catch (InterruptedException e) {
  					//
  				}
  
  				long end = System.currentTimeMillis();
  
  				if ((this.owner != null) && (timeout != -1)
  						&& ((end - start) >= timeout)) {
  					throw new RuntimeException("TimeoutException");
  				}
  			}
  
  			this.owner = new WeakReference(Thread.currentThread());
  			this.acquire++;
  		}
  	}
docs: Acquires this mutex
  
  @param timeout
  maximum time to wait for acquiring
  
  @throws RuntimeException
  if timeout is reached and no acquire was possible.