/**
  * Acquires a lock on the file. Does nothing if the correct lock has already been acquired.
  * Otherwise, releases an existing lock.
  *
  * @param shared shared/exclusive lock
  * @return success flag
  * @throws IOException I/O exception
  */
 private boolean lck(final boolean shared) throws IOException {
   if (fl != null && shared == fl.isShared()) return true;
   if (fl != null) fl.release();
   fl = file.getChannel().tryLock(0, Long.MAX_VALUE, shared);
   return fl != null;
 }