2011-06-16 57 views
3

在Java 1.5中,java.nio.channels.FileLock没有检查查看已经被锁定的文件。 Referenced HereJava 5和Java 6之间的FileLock变化

的片段状态:

的java.nio.channels.FileLock中的类检查已经通过 其他FileChannel实例

锁定的文件

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

因此,在Java 6之前,如果有多个程序写入同一个文件(每个程序试图获得排他锁),排他性文件锁定不起作用。人们如何在Java 5之前和之前解决这个问题?

回答

1

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

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

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

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