使用Java FileLock有多安全?

使用Java FileLock有多安全?,java,nio,file-locking,filelock,Java,Nio,File Locking,Filelock,在进程之间锁定文件的安全性如何?据说,如果我们拥有独占锁,其他进程无法访问该文件。但是,下面关于另一个问题的回答指出,为了使我们的进程安全,其他进程也必须检查文件锁 (a) 您知道锁定文件不会阻止其他进程接触它,除非它们也使用锁吗 因此,我测试了我的代码并试图更改,我已经用Windows文本编辑器锁定了一个文件,我没有受到伤害,但当我用记事本++进行测试时没有 在Java 6中是否有适当锁定文件的解决方案?来自平台下依赖项的Javadoc: 某些系统的本机文件锁定功能只是建议性的,这意味着程序必

在进程之间锁定文件的安全性如何?据说,如果我们拥有独占锁,其他进程无法访问该文件。但是,下面关于另一个问题的回答指出,为了使我们的进程安全,其他进程也必须检查文件锁

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

因此,我测试了我的代码并试图更改,我已经用Windows文本编辑器锁定了一个文件,我没有受到伤害,但当我用记事本++进行测试时没有

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

来自平台下依赖项的Javadoc:

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

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

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

据说,如果我们拥有独占锁,其他进程无法访问该文件

说明在哪里?不在Javadoc中

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

这是正确的

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

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

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


除非您锁定的应用程序也使用文件锁。

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

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

  • 对于Linux和类似系统,文件锁定只是一种建议

  • 对于Windows,根据:

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

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


使用Java FileLock有多安全

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


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

只有在所有应用程序(Java和其他)合作的情况下;e、 g.使用
FileLock
或同等工具


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

在java.nio.channels.FileChannel中,tryLock方法返回:表示新获取的锁的lock对象,或者如果由于另一个程序持有重叠锁而无法获取锁,则返回null。但是,如果此Java虚拟机已持有与请求区域重叠的锁,或者此方法中已阻止另一个线程并试图锁定重叠区域,则引发异常region@Guillotine1789如果这是为了支持你以“it is stated…”开头的陈述,那么它就不是。如果不是的话,我就想不起相关性了。很抱歉,我没有及时回复,这又有什么关系呢?是否将另一个程序视为另一个进程?您写道“如果我们拥有独占锁,则其他进程无法访问该文件”。上面的报价中没有任何关于访问的内容,也没有任何关于其他进程可以做什么和不能做什么的内容。另请参阅@Raedwald,谢谢。没有说明。您的问题基于错误的前提。在Unix系统上,可以安全地假设它们是POSIX建议锁: