【问题标题】:How safe is it to use Java FileLock?使用 Java FileLock 有多安全?
【发布时间】:2016-01-14 07:25:45
【问题描述】:

使用java.nio.channels.FileLock 在进程之间锁定文件有多安全?据说如果我们有排他锁,其他进程就不能访问该文件。但是,下面对另一个 SO question 的回答指出,其他进程也必须检查文件锁,以确保我们的进程安全。

(a) 您是否知道锁定文件不会阻止其他进程接触它,除非它们也使用锁?

所以我测试了我的代码并尝试更改一个我已经锁定的文件,使用 Windows 文本编辑器,我没有受到伤害,但当我使用 Notepad++..

是否有在 Java 6 中适当锁定文件的解决方案?

【问题讨论】:

标签: java nio file-locking filelock


【解决方案1】:

Java FileLock 在许多平台上使用advisory(不是强制)锁。这意味着它可能只针对同样使用FileLock(或其他语言的等效项)的其他应用程序提供锁定。

Linux 或 Windows 都没有全面实施强制锁定。例如:

  • 对于 Linux 和类似系统,文件锁定仅供参考。

  • 对于Windows,根据Wikipedia

    “对于在 Windows 中使用文件读/写 API 的应用程序,字节范围锁是由执行的文件系统强制执行的。 在 Windows 中。对于使用文件映射 API 的应用程序 Windows,不强制执行字节范围锁……”

    换句话说,Windows 上的锁定可以是强制性的,也可以是建议性的,这取决于 Windows 应用程序使用哪个 API 来访问文件。


使用 Java FileLock 的安全性如何?

如果您实际上是在询问是否可以安全地假设FileLock 对所有其他应用程序(Java 和非 Java)提供强制文件锁定,而不管它们是如何编写的,答案是否定的。它不是可以安全地做出这样的假设。


是否有在 Java 6 中适当锁定文件的解决方案?

只有在所有应用程序(Java 和其他)合作的情况下;例如通过使用 FileLock 或等效项。

如果您不能做出这样的假设,那么就没有使用可移植 Java 的解决方案。事实上,在大多数(如果不是全部)常见的操作系统平台上,根本没有解决方案,AFAIK ......因为平台本身不支持独立于应用程序的强制文件锁定。

【讨论】:

【解决方案2】:

来自平台依赖下java.nio.channels.FileLock的Javadoc:

某些系统的本地文件锁定功能只是建议性的,这意味着程序必须协同遵守已知的锁定协议以保证数据完整性。在其他系统上,本地文件锁是强制性的,这意味着如果一个程序锁定了文件的某个区域,那么实际上会阻止其他程序以违反锁的方式访问该区域。在其他系统上,本机文件锁是建议性的还是强制性的,可以根据每个文件进行配置。为确保跨平台的一致和正确行为,强烈建议将此 API 提供的锁用作建议锁。

正如您从测试中发现的那样,在您的 Windows 版本上运行的其他非 Java 代码不必遵守您的排他锁。

您唯一的解决方案是尽可能快地将文件读入内存,花时间处理信息,然后尽可能快地将文件写入磁盘。

【讨论】:

    【解决方案3】:

    如果我们有排他锁,其他进程就不能访问该文件。

    在哪里?在Javadoc中没有。

    但是,以下对另一个 [SO 问题][2] 的回答指出,其他进程也必须检查文件锁,以确保我们的进程安全。

    没错。

    所以我测试了我的代码并尝试更改一个我已经锁定的文件,使用 Windows 文本编辑器,我没有受到伤害,但当我使用 Notepad++。

    通过在文件锁影响普通打开的一个平台上进行测试,您已经在做一些无效的事情,但从中得出的唯一结论是它不安全。 Notepad++ 保持文件打开,因此会遇到您的锁,但 Windows 文本编辑器不会,因此也看不到锁,直到您尝试保存。

    在 Java 6 中是否有适当锁定文件的解决方案?

    除非您锁定的应用程序也使用文件锁,否则不会。

    【讨论】:

    • 在 java.nio.channels.FileChannel 中,tryLock 方法返回:表示新获得的锁的锁对象,如果由于另一个程序持有重叠锁而无法获得锁,则返回 null。但如果此 Java 虚拟机已持有与请求区域重叠的锁,或者如果另一个线程已在此方法中阻塞并试图锁定重叠区域,则会引发异常
    • @Guillotine1789 如果那是为了支持您以“它被声明......”开头的声明,它不会。如果没有,相关性逃脱了我。
    • 抱歉回复晚了怎么不相关?将另一个程序视为另一个进程?
    • 你写了'据说如果我们有排他锁,其他进程不能访问文件'。您上面的引文中没有任何内容说明访问权限或其他进程可以做什么和不能做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    相关资源
    最近更新 更多