code: void xLock(Object obj, long txNum) {
  		Object anchor = getAnchor(obj);
  		txWaitMap.put(txNum, anchor);
  		synchronized (anchor) {
  			Lockers lks = prepareLockers(obj);
  
  			if (hasXLock(lks, txNum))
  				return;
  
  			try {
  				long timestamp = System.currentTimeMillis();
  				while (!xLockable(lks, txNum) && !waitingTooLong(timestamp)) {
  					avoidDeadlock(lks, txNum, X_LOCK);
  					lks.requestSet.add(txNum);
  					
  					anchor.wait(MAX_TIME);
  					lks.requestSet.remove(txNum);
  				}
  				if (!xLockable(lks, txNum))
  					throw new LockAbortException();
  				lks.xLocker = txNum;
  				getObjectSet(txNum).add(obj);
  			} catch (InterruptedException e) {
  				throw new LockAbortException();
  			}
  		}
  		txWaitMap.remove(txNum);
  	}
docs: Grants an xlock on the specified item. If any conflict lock exists when
  the method is called, then the calling thread will be placed on a wait
  list until the lock is released. If the thread remains on the wait list
  for a certain amount of time, then an exception is thrown.
  
  @param obj
  a lockable item
  @param txNum
  a transaction number