在Java1.5中,java.nio.channels.FileLock没有检查已经锁定的文件。在此参考
片段声明:
java.nio.channels.FileLock类检查已被其他FileChannel实例锁定的文件 如果应用程序试图锁定与通过另一个FileChannel实例锁定的区域重叠的区域,则Java 6将抛出一个FileChannel。以前的版本没有检查其他FileChannel实例获得的文件锁。默认情况下,java.nio.channels.FileChannel.lock方法检查请求的锁是否与此Java虚拟机持有的区域重叠。
因此,在预Java 6中,如果有多个程序写入同一个文件(每个程序都试图获得独占锁),独占文件锁定就无法工作。人们是如何用Java 5和之前的版本来解决这个问题的?
发布于 2011-06-16 20:47:15
我不认为Java5 5的行为是一个严重的问题。
考虑将文件锁与进程关联的OS。如果一个进程已经拥有一个文件锁,当它再次请求该锁时,OS可以授予它而不会出错。从某种意义上说,这是一种“重入式”锁。它防止两个进程同时锁定同一个文件,并且由进程来确保当它拥有锁时,它不会有两个线程对文件进行一些重叠的更改。
在JVM中通常有很多独立的包,必须有两个包试图锁定同一个文件的用例。如果他们都被授予了锁,我们就有麻烦了。很难要求这两个独立的包以某种方式合作,因此Java6将所有权从整个过程缩减为一个渠道。(希望这两个包不会共享同一个频道)
然而,这样的用例可能并不常见。通常,文件是某种特殊类型的文件,只能由某个包处理。假设一个数据库包,它的文件不太可能被同一个JVM中的其他包所接触,但在其他JVM中可能会被同一个包所接触。因此,在这种情况下,Java5 5的行为是可以的,而且这种情况可能是大多数情况。
https://stackoverflow.com/questions/6378191
复制相似问题