以下Java代码是否保证Windows中未打开文件的独占锁定?
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
File file = new File("mylog.log");
try {
FileOutputStream fos = new FileOutputStream(file);
fos.getChannel().lock();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
可以在Java规范中看到:
代表整个Java虚拟机保存文件锁。它们不适合控制同一虚拟机中多个线程对文件的访问。
因此,如果您需要为该主题提供独占锁定,请选择其他方式。
答案 1 :(得分:1)
tl; dr:否。您不能对主机操作系统处理锁的行为做出假设。
好消息:您是否在尝试确保应用程序中具有线程安全锁定机制?如果是这样,FileLock
就足够了(假设应用程序的其余部分由正确编写的线程安全代码组成)。
坏消息:不幸的是,如果您要确保Windows能够兑现对所有应用程序的锁定,那么您就不能指望它。
在Windows中很容易观察到:您经常可以覆盖正在写入的文件(例如,当日志文件太长时,我会删除所有以前的垃圾邮件)。也就是说,Windows通常不允许您删除打开的文件。
From the FileLock documentation:
代表文件锁 整个Java虚拟机。他们是 不适合控制访问 一个文件由多个线程内的 相同的虚拟机。
文件锁定对象可以安全使用 多个并发线程。
......以后......
是否实际锁定 防止其他程序 访问锁定的内容 区域是系统依赖的 因此未指明。本土的 一些文件锁定设施 系统只是建议,意思 程序必须合作 观察已知的锁定协议 为了保证数据的完整性。上 其他系统本机文件锁是 强制性,意味着如果一个程序 锁定文件的区域,然后锁定其他区域 实际上阻止了程序 以某种方式访问该区域 会违反锁定。还有一点 系统,无论是本机文件锁 咨询或强制性是可配置的 在每个文件的基础上。确保 一致和正确的行为 平台,强烈推荐 这个API提供的锁是 就像他们是咨询锁一样。
答案 2 :(得分:0)
即使您对文件使用锁定和解锁标志,您也只能保证在Java应用程序中具有独占锁 。
您必须使用JNI或其他计算机语言进行Windows调用以保证对Windows文件的独占锁定。
Windows LockFile功能
Windows UnlockFile功能