Я получаю блокировку файла в одном приложении Java со следующим кодом:
...
File file = new File("/some/file/at/some/path.txt");
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
FileLock lock = channel.tryLock();
if (lock != null) {
Thread.sleep(60000); // Hold lock for 60 seconds
lock.release();
}
...
Если в течение вышеупомянутых 60 секунд я запустил другое Java-приложение со следующим кодом, оно не может получить блокировку (как и ожидалось), но все равно может писать.
...
File file = new File("/some/file/at/some/path.txt");
System.out.println(file.canWrite()); // returns true (not expected)
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
FileLock lock = channel.tryLock();
System.out.println(lock.toString()); // throws NullPointerException (expected)
...
Тот же файл (в то время как блокировка удерживается первым приложением) доступна для записи также не-Java-приложениями (такими как vi, bash и т. Д.). Oracle docs говорит, что блокировка соответствует встроенной блокировке базовой ОС и, следовательно, видима для всех программ. Следовательно, я ожидал, что блокировка не позволит любому другому процессу писать на нем.
Я что-то упускаю в своем коде или в моем понимании?
Я использую приведенный выше код в MacOS Mojave (10.14).