@Override
  public boolean unlock(Data key, String caller, long threadId, long referenceId) {
    LockResourceImpl lock = locks.get(key);
    if (lock == null) {
      return false;
    }

    boolean result = false;
    if (lock.canAcquireLock(caller, threadId)) {
      if (lock.unlock(caller, threadId, referenceId)) {
        result = true;
      }
    }
    if (lock.isRemovable()) {
      locks.remove(key);
    }
    return result;
  }