Java NIO FileLock 允许其他进程写入锁定的文件
Java NIO FileLock allows other process to write to a locked file
我正在使用以下代码获取一个 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 表示锁映射到底层 OS 的本机锁定,因此对所有程序可见。因此,我希望锁可以防止任何其他进程对其进行写入。
我的代码或我的理解是否遗漏了什么?
我运行在 MacOS Mojave (10.14) 上运行上述代码。
它还在文档中说你 link 到 "Whether or not a lock actually prevents another program from accessing the content of the locked region is system-dependent and therefore unspecified."
所以这取决于OS是否能够进行写锁定。
我正在使用以下代码获取一个 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 表示锁映射到底层 OS 的本机锁定,因此对所有程序可见。因此,我希望锁可以防止任何其他进程对其进行写入。
我的代码或我的理解是否遗漏了什么?
我运行在 MacOS Mojave (10.14) 上运行上述代码。
它还在文档中说你 link 到 "Whether or not a lock actually prevents another program from accessing the content of the locked region is system-dependent and therefore unspecified."
所以这取决于OS是否能够进行写锁定。