Java 5和Java 6之间的FileLock变化

3
在Java 1.5中,java.nio.channels.FileLock没有检查已经被锁定的文件。 参考此处 代码片段说明:
java.nio.channels.FileLock类检查其他FileChannel实例已锁定的文件。
如果应用程序尝试锁定与通过另一个FileChannel实例锁定的区域重叠的区域,则Java SE 6会抛出OverlappingFileLockException。之前的版本没有检查由其他FileChannel实例获取的文件锁定。默认情况下,java.nio.channels.FileChannel.lock方法检查所请求的锁是否与此Java虚拟机持有的区域重叠。
因此,在Java 6之前,如果您有多个程序写入同一文件(每个程序尝试获取独占锁),独占文件锁定将无法工作。人们如何处理Java 5及其之前的版本?
1个回答

1

我认为Java5的行为不是一个严重的问题。

考虑一个将文件锁与进程相关联的操作系统。如果一个进程已经拥有了文件锁,当它再次请求锁时,操作系统可以无错误地授予它。从某种意义上说,这是一个“可重入”锁。它防止两个进程同时锁定同一个文件,并且由进程来确保当它拥有锁时,它不会有两个线程对文件进行重叠更改。

在JVM中通常有许多独立的包,必须存在两个包尝试锁定同一个文件的用例。如果它们都被授予锁,则我们遇到了问题。很难要求这两个独立的包以某种方式合作,因此Java6将所有权从整个进程缩小到通道。(希望这两个包不会共享同一个通道)

然而,这样的用例可能并不是非常普遍。通常,文件属于某种特殊类型,只会由某个特定的包处理。想象一下数据库包,它的文件不太可能被同一JVM中的其他包触及,但可能会被其他JVM中的同一包触及。因此,在这种情况下,Java5的行为是可以接受的,而这样的情况可能占大多数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接