我正在使用以下代码在一个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说,该锁映射到底层操作系统的本机锁,因此对所有程序都是可见的。因此,我期望锁能够阻止任何其他进程在其上进行写入。
我在代码或我的理解中缺少什么吗?
我正在MacOS Mojave(10.14)上运行以上代码。
答案 0 :(得分:2)
它还说您在文档中链接到“一个锁是否实际上阻止另一个程序访问该锁区域的内容是系统相关的,因此未指定。”
因此,这取决于操作系统是否能够执行写锁定。