Java NIO FileLock позволяет другому процессу записывать в заблокированный файл - PullRequest
1 голос
/ 05 июня 2019

Я получаю блокировку файла в одном приложении 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).

1 Ответ

2 голосов
/ 05 июня 2019

В документах, на которые вы ссылаетесь, также говорится: «Фактически, блокировка не позволяет другой программе получить доступ к содержимому заблокированной области, зависит от системы и, следовательно, не определена».

Таким образом, это зависит от того, способна ли ОС выполнять блокировку записи.

...