使用java.nio.channels.FileLock在进程间锁定文件有多安全?据说如果我们有一个独占锁,其他进程就无法访问该文件。但是,对于另一个SO question状态的以下答案,其他进程也必须检查文件锁,以便我们的进程安全。
(a)您是否知道锁定文件不会阻止其他进程触及它,除非他们也使用锁?
所以我测试了我的代码,并尝试使用 Windows文本编辑器来更改,我已经锁定的文件,并且我不会受到伤害,但是当我使用 Notepad ++ < / EM> ..
是否有解决方案在Java 6中正确锁定文件?
答案 0 :(得分:8)
Java FileLock
在许多平台上使用建议(非强制)锁。这意味着它可能仅对其他使用FileLock
(或其他语言中的等价物)的应用程序提供锁定。
Linux或Windows都没有全面实施强制锁定。例如:
对于Linux等,文件锁定仅供参考。
对于Windows,根据Wikipedia:
&#34;对于在Windows中使用文件读/写API的应用程序,由执行的文件系统强制执行字节范围锁定.... 在Windows中。对于使用文件映射API的应用程序 Windows,字节范围锁不会强制执行......&#34;
换句话说,Windows上的锁定可以是强制性的,也可以是建议性的,具体取决于Windows应用程序用来访问文件的API。
使用Java FileLock有多安全?
如果您实际上在询问是否可以安全地假设FileLock
提供了与所有其他应用程序(Java和非Java)相关的强制文件锁定,无论它们是如何编写的,答案都是否定的。做出这个假设是不安全的。
是否有解决方案在Java 6中正确锁定文件?
只有所有应用程序(Java和其他)合作;例如使用FileLock
或等效的。
如果你不能做出这样的假设,那么就没有使用便携式Java的解决方案。实际上,在大多数(如果不是全部)常见操作系统平台上,根本没有解决方案,AFAIK ......因为平台本身并不支持独立于应用程序的强制文件锁定。
答案 1 :(得分:0)
来自平台依赖项下的java.nio.channels.FileLock的Javadoc:
某些系统的本机文件锁定功能仅仅是建议性的,这意味着程序必须协作地观察已知的锁定协议,以保证数据的完整性。在其他系统上,本机文件锁是必需的,这意味着如果一个程序锁定文件的某个区域,则实际上阻止其他程序以违反该锁的方式访问该区域。在其他系统上,可以基于每个文件配置本机文件锁是建议性的还是必需的。为了确保跨平台的一致和正确的行为,强烈建议使用此API提供的锁,就像它们是咨询锁一样。
正如您在测试中发现的那样,在您的Windows版本上运行的其他非Java代码不必遵守您的独占锁定。
您唯一的解决方案是尽可能快地将文件读入内存,花时间处理信息,然后尽快将文件写入磁盘。
答案 2 :(得分:0)
据说如果我们有一个独占锁,其他进程就无法访问该文件。
声明在哪里?不在Javadoc中。
然而,另一个[SO问题] [2]的下面答案表明其他进程也必须检查文件锁,以便我们的进程安全。
这是正确的。
所以我测试了我的代码,并尝试使用 Windows文本编辑器来更改,我已经锁定的文件,并且我不会受到伤害,但是当我使用 Notepad ++ < / em>的
您已经通过在文件锁影响普通打开的平台上进行测试来做一些无效的事情,但唯一可以得出的结论是它不安全。 Notepad ++保持文件打开,因此遇到你的锁,但是Windows文本编辑器没有,所以在你尝试保存之前也没有看到锁。
是否有解决方案在Java 6中正确锁定文件?
除非您锁定的应用程序也使用文件锁。