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 及之前的版本解决这个问题的?

4

1 回答 1

1

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

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

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

然而,这样的用例可能并不常见。通常文件是某种特殊类型的文件,只能由某个包处理。想象一个数据库包,它的文件不太可能被同一个 JVM 中的其他包接触,但可能被其他 JVM 中的同一个包接触。所以在这种情况下 Java5 的行为会很好,而且这种情况可能是大多数。

于 2011-06-16T20:47:15.547 回答