【问题标题】:Problem with Java file locking mechanism (FileLock etc)Java文件锁定机制(FileLock等)的问题
【发布时间】:2010-03-19 17:14:49
【问题描述】:

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

为此,我使用以下代码:

函数 void readFile(){

   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),应用程序的其他实例现在也可以访问正在编辑的文件。

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

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

【问题讨论】:

  • Windows? Linux?苹果系统?文件锁定实际上是一种操作系统功能。
  • 我已经在 MacOS 和 WindowsXP 上测试过了。我知道不同的底层操作系统可能对锁定过程造成的影响。我不认为它与操作系统有任何关系。谢谢!
  • 看起来像一个 JDK 错误。您是否尝试提交错误请求?

标签: java filelock


【解决方案1】:

来自 FileLock JavaDocs:

锁是否真正阻止另一个程序访问锁定区域的内容取决于系统,因此未指定。

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

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

JavaDocs 还明确指出:

代表整个 Java 虚拟机持有文件锁。它们不适用于控制同一虚拟机内的多个线程对文件的访问。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多