Какова цель ожидания в FileChannel.lock, если OverlappingFileLockException генерируется в любом случае? - PullRequest
0 голосов
/ 14 октября 2018

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, не меняет этого поведения.

1 Ответ

0 голосов
/ 14 октября 2018

Блокировки файлов хранятся от имени всей виртуальной машины Java.Они не подходят для управления доступом к файлу несколькими потоками на одной и той же виртуальной машине.

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

«Подходящий» может означать в этом контексте много вещей, включая понятия неэффективности по сравнению с блокировками на основе потоков.Они должны использоваться для защиты блокировки файла при доступе к нему из нескольких потоков.

...