Java NIO FileLock 允许其他进程写入锁定的文件

标签 java nio file-locking filelock

我使用以下代码在一个 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表示该锁映射到底层操作系统的 native 锁定,因此对所有程序都可见。因此,我希望锁能够阻止任何其他进程对其进行写入。

我的代码或我的理解中是否遗漏了某些内容?

我在 MacOS Mojave (10.14) 上运行上述代码。

最佳答案

它还在您链接到的文档中说“锁是否实际上阻止另一个程序访问锁定区域的内容取决于系统,因此未指定。”

所以这取决于操作系统是否能够进行写锁。

关于Java NIO FileLock 允许其他进程写入锁定的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56458266/

相关文章:

Java NIO 非阻塞读取返回超时(linux 内核问题?)

java - 我可以通过 JNI 从 Java 调用的 EPoll C 实现

Java:SelectionKey.attach() 损坏了吗?

java - 在 Java 中,使用 java.nio 库和 FileChannel,如何从文件加载 Properties 对象?

.net - 哪个调试工具(如果有)允许我识别持有文件锁的线程?

windows - 记事本打败了所有人?

java - 在 Android 中解密 Rijndael

java - android中自定义对话框中按钮的单击事件

java - 拒绝访问 - 使用身份验证机制 PLAIN RabbitMQ 队列拒绝登录

java - 如何将外部文件夹添加到类路径?