当使用Java的FileLock时,可以让close()自动执行lock.release()吗?

2022-09-04 22:14:57

正如大多数人应该知道的那样,也关闭了任何流使用。close()

这允许以下代码:

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

这很好,因为我们不需要引用并记住关闭它。FileInputStream

但它也适用于s吗?FileLock

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();
}

我已经尝试了这个代码,并且锁在调用时被正确释放,但是这样做是安全的吗?Closeable JavaDoc说:“关闭这个流并释放与之相关的任何系统资源。我可以安全地假设我正在使用锁定指定的吗?br.close()close()release()


答案 1

根据JavaDoc:

在通过调用 release 方法、关闭用于获取锁的通道或终止 Java 虚拟机(以先到者为准)来释放锁之前,它一直有效。

以下是FileInputStream.close()

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

看起来在流上关闭了释放锁的通道。close


答案 2

是的。

锁取决于文件描述符。当进程中没有表示文件的文件描述符时,就不会有与之关联的锁。


推荐