【问题标题】:FileLock changes between java 5 and java 6java 5 和 java 6 之间的 FileLock 变化
【发布时间】:2011-06-16 20:28:30
【问题描述】:

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

sn-p 状态:

java.nio.channels.FileLock 类检查已被锁定的文件 其他 FileChannel 实例

Java SE 6 抛出一个 如果出现 OverlappingFileLockException 应用程序尝试锁定一个区域 与锁定的区域重叠 另一个 FileChannel 实例。以前的 版本没有检查文件锁 由其他 FileChannel 获取 实例。默认情况下 java.nio.channels.FileChannel.lock 方法检查请求的锁是否 与此持有的区域重叠 Java 虚拟机。

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

【问题讨论】:

    标签: java jdk1.6 file-locking jdk1.5


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多