java - Java 5 和 Java 6 之间的 FileLock 变化

标签 java java-6 file-locking java-5

在 Java 1.5 中,java.nio.channels.FileLock 不检查已锁定的文件。 Referenced Here

代码片段指出:

The java.nio.channels.FileLock class checks for files already locked by other FileChannel instances

Java SE 6 throws an OverlappingFileLockException if an application attempts to lock a region that overlaps a region locked through another FileChannel instance. Previous versions did not check for file locks obtained by other FileChannel instances. By default the java.nio.channels.FileChannel.lock method checks if the requested lock overlaps with a region held by this Java virtual machine.

因此,在 Java 6 之前的版本中,如果您有多个程序写入同一个文件(每个程序都试图获得排他锁),则排他文件锁定不起作用。人们如何使用 Java 5 及更早版本解决这个问题?

最佳答案

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

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

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

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

关于java - Java 5 和 Java 6 之间的 FileLock 变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6378191/

相关文章:

java - 更新到 bumblebee android studio 版本时出现错误 gradle

java - 如何将 Java 1.5 类与 Java 1.6 类链接?

python - 原子访问的文件锁不起作用

c - 在 Linux 和 OS/X 上模拟 Windows 风格的文件锁定

java - 解码从 XML 文件中检索到的特殊字符

java - 找到最长的公共(public)前缀?

java - 我将扫描仪转换为 char 为什么这会给我一个不匹配的异常?

Java 6 应用程序无法从任何版本的 SDK 部署到 Google App Engine

java - 为 java 6 而不是 java 7 编译有什么缺点吗?

c# - 有没有办法检查文件是否正在使用?