При использовании Java FileLock разрешено ли закрывать() автоматически делать lock.release()?

Как известно большинству, close() также закрывает использование любых потоков.

Это позволяет использовать следующий код:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
...
br.close();

Это хорошо, поскольку нам не нужна ссылка на FileInputStream и не забудьте закрыть его.

Но это также работает для FileLock s?

final FileInputStream fis = new FileInputStream(new File("buffer.txt"));
final FileChannel c = fis.getChannel();
final FileLock lock = c.lock(0L, Long.MAX_VALUE, true);
final BufferedReader br = new BufferedReader(new InputStreamReader(fis));

try {
    while(br.ready()) {
        System.out.println(br.readLine());
    }
} finally {
    br.close();
}

Я пробовал этот код, и блокировка была правильно выпущена при вызове br.close(), но безопасно ли это сделать? Closeable JavaDoc говорит: "Закрывает этот поток и выпускает любые связанные с ним системные ресурсы". Можно ли предположить, что я использую close() как указано для release() блокировки?

Ответ 1

В соответствии с JavaDoc:

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

И вот содержимое FileInputStream.close()

public void close() throws IOException {
    if (channel != null)
        channel.close();
    close0();
}

Похоже, что close в потоке закрывает канал, который освобождает блокировку.

Ответ 2

Да.

Замки зависят от дескриптора файла. Когда нет дескриптора файла, представляющего файл в процессе, не было бы привязки к нему.