gpt4 book ai didi

java - Java 文件锁定机制(FileLock 等)的问题

转载 作者:搜寻专家 更新时间:2023-11-01 01:58:28 24 4
gpt4 key购买 nike

我正在创建一个用于打开和编辑 xml 文件的简单应用程序。这些文件位于应用程序的多个实例访问的本地文件夹中。我想要做的是锁定应用程序实例打开的每个文件,以便其他实例无法访问它。

为此,我使用了以下代码:

函数无效读取文件(){

   File xmlFile = new File("myFile.xml");
RandomAccessFile raf = new RandomAccessFile(xmlFile, "rw");
FileLock fl = raf.getChannel().tryLock();

if(fl==null){
System.out.println("file already locked by another instance");
}else{
setCurrentFile(raf);
setLock(fl);
System.out.println("file successfully locked by this instance");
}

因为我想在持续时间内锁定正在编辑的文件,所以我既不关闭 raf 也不释放 fl。

此时,尝试访问锁定文件的应用程序的任何其他实例都无法访问。到目前为止一切顺利。

我观察到以下奇怪的事情:

如果在获取文件锁定后,我在同一个文件上打开一个 FileInputStream,即使 FileLock 对象仍然有效(isValid 返回 true),应用程序的其他实例现在可以访问正在编辑的文件。

我觉得这种行为很奇怪。谁能解释为什么会这样?

我希望以上内容有意义。提前致谢!

最佳答案

来自 FileLock JavaDocs:

Whether or not a lock actually prevents another program from accessing the content of the locked region is system-dependent and therefore unspecified.

您的平台仅提供建议性锁定。持有咨询锁不会阻止其他进程访问该文件。

因此,锁定文件实际上只是挂出“请勿打扰”的牌子,但不锁门。如果每个人都阅读并尊重这个标志,那你就很好,但这并不能阻止任何人走进来。

JavaDocs 也明确指出:

File locks are held on behalf of the entire Java virtual machine. They are not suitable for controlling access to a file by multiple threads within the same virtual machine.

如果您的代码在应用程序服务器中运行,文件锁定将无法满足您的需要。

关于java - Java 文件锁定机制(FileLock 等)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2479222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com