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

Java NIO FileLock允许其他进程写入锁定的文件,java,nio,file-locking,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

我正在一个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等)写入。表示锁映射到底层操作系统的本机锁定,因此对所有程序都可见。因此,我希望锁能够阻止任何其他进程在其上写入

我是在代码中还是在理解中遗漏了什么


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

在您链接到的文档中还指出,“锁是否确实阻止其他程序访问锁定区域的内容取决于系统,因此未指定。”


因此,这取决于操作系统是否能够执行写锁定。

正确。有没有关于各种操作系统上FileLock行为的官方/非官方文档?我不知道。您需要检查操作系统的特定版本以及您正在运行的JVM的版本。是否至少可以保证在一个JVM上运行的应用程序可以看到另一个JVM中的应用程序获取的锁(如果它检查是否存在)?就像我问题中的一个例子。或者这也是特定于操作系统的?我不认为这是指定的,并且将再次依赖于操作系统的锁定方法。文档中说这些锁应该被认为是建议性的。我想除了在Windows上,文件锁在任何地方都是建议性的,但不要引用我的话。