FileChannel.lock
позволяет создать блокировку файла в Java (я использую подход из Как я могу заблокировать файл, используя java (если возможно) с помощью FileOutputStream
, чтобы избежать NonWritableChannelException
):
FileOutputStream out = new FileOutputStream(file);
try {
java.nio.channels.FileLock lock = out.getChannel().lock();
try {
...
} finally {
lock.release();
}
} finally {
out.close();
}
Важная часть работы с блокировками, ожидающими их освобождения процессом, удерживающим ресурс.Следовательно, lock
будет блокироваться до тех пор, пока регион не будет заблокирован, этот канал не будет закрыт или не будет вызван вызывающий поток, в зависимости от того, что произойдет раньше.
Однако каждый разЯ пытаюсь заблокировать тот же файл (область, охватывающая весь файл), я получаю OverlappingFileLockException
, который выбрасывается
Если блокировка, перекрывающая запрашиваемую область, уже удерживается этой виртуальной машиной Javaили если другой поток уже заблокирован в этом методе и пытается заблокировать перекрывающуюся область
Это противоречит логике блокировки и делает невозможным работу с блокировками файлов, поскольку необходимо синхронизировать ресурсдоступ вручную, если разрешен только один поток в очереди (дальнейшие немедленно выбрасывают OverlappingFileLockException
).
Использование lock(0, Long.MAX_VALUE, false)
, где false
ссылается на свойство shared
, не меняет этого поведения.